伪随机密码生成器/密码管理器。

prpg的Python项目详细描述


一个单行密码管理器。

,没有储存的东西就不能被偷走。此外,核心算法非常简单,如果你是一个密码迷,你可以亲自验证是否没有出错的空间。
-pro:\u允许你恢复密码,即使这个软件停止工作。只要你有一些非常广泛的加密工具(比如python/node/ruby的标准库中的那些工具)。
-con:\u不允许你存储现有的/自定义的密码,因为它的所有密码都是自动生成的难以键入的mush堆(尽管,多亏了复制粘贴,"难以键入"通常不是问题。
-con:"还没有浏览器集成"。我知道这就是普通人喜欢密码管理器的原因。

-[安装/使用](安装使用)
-[内部/重新实现](内部实现)

所有其他密码都是有效的数字签名:对于知道主密码的人来说,字符串很容易生成,而对于不知道主密码的人来说,则难以计算。

[图表](diagram.png)

关于与任何其他站点对应的密码。



即使在原则上,也不可能有人从这个密码管理器中窃取它们,除非他们有你的主密码(在这种情况下,你显然是命中注定的),或者他们破解了SHA256或PBKDF2(在这种情况下,我们都是)。
-你可以把这个密码管理器放在脑子里。只要记住你的主密码和算法,你就可以在不到五分钟的时间里从零开始(如果你相当精通计算机)从内存中重新获得所有密码,只使用非常广泛的严格指定的算法,每种主要语言在功能上都有完全相同的实现。你不需要相信我。你不依赖我。如果您无法访问此软件包,或停止信任它,或其他什么情况,您可以自行重新实现该方案并恢复所有密码。
-以一些繁琐的手动操作为代价,你可以输入你的主密码,以确保它无法恢复,除非坏人直接窥探这个进程的内存或操作系统的rng。


您不能存储以前存在的密码。(还。这可能会发生。)
-如果有人窃取了您在该系统中的主密码,他们可以重新获取您的所有密码。其他密码管理器也有这个问题,但他们至少要求坏人也偷你的保险库文件。(除非密码管理器是基于云的,在这种情况下,您注定要失败。)
-生成的密码很难键入,也很难记住。复制粘贴是唯一有用的方法。



独立用法:

`` bash
~$prpg compute'example.com:username'
master:*****
将'example.com:username'的密码复制到剪贴板。
~$
```

ault,这将生成一个20个字符的密码,其中包含所有主要类型的字符(小写、大写、数字、标点符号)和96位熵——但这是可自定义的。

但使用这种用法,您必须记住所有站点/用户名等——并准确地记住它们——然后键入它们每次。真麻烦!

因此,prpg可以维护一个字符串列表(称为"salt",用于加密目的),它可以很容易地通过前缀模糊搜索:

``` bash
~$alias addsalt=-prpg salts add'
~$alias pw=-prpg recall'
~$
~$设置一个新的salt,一旦
~$addsalt'example.com:username'
在'/home/spencer/.prpg salts.json'中创建新的salt文件
~$rot13<;~/.prpg salts.json
{
"example.com:username":{}
}
~$
$\compute your password
~$pw ex
selected salt:"example.com:username"
master:*****
将"example.com:username"的密码复制到剪贴板。
~$
````

(salt文件是rot13加密的默认情况下,作为一种弱保护,防止有人在您的计算机上搜索与银行相关的单词。是的,我知道通过默默无闻来保证安全是不受欢迎的,但是——嘿,如果你保持默默无闻就行了。我希望这个包能做到这一点。)

(而且,"sitename.com:myusername"格式没有什么特别之处!盐可以是您想要的任何东西。)


每个盐都有一个与之关联的json对象,您可以使用"prpg salts get saltname"查看该对象。您可以在此对象中存储任意信息(但请记住,它存储在有效的纯文本中!所以请不要太敏感!:

``bash
~$addsalt'blub.com:mylogin'--json'{"电子邮件地址":"nobody@invalid.com","birthday":"1970-01-01"}
~$prpg salts get bl
{"birthday":"1970-01-01","电子邮件地址":"nobody@invalid.com"}
`````

对象还可以有一些特殊的键,用"双下划线"表示:

-``后处理``允许您使用python lambda在密码上编写任意转换:

`` bash
~$addsalt'愚蠢的短最大密码长度。com:spencer'--json'{"`后处理`"lambda pw:pw[:12]"}"
~$prpg stu--print
selected salt:'stupid short max password length.com:spencer'
master:*****
+viw/gnixpdg
~$
````

(详细信息:传递给lambda函数的字符串是'base64(sha256(…)`--也就是说,一个32字节的伪随机数,base64编码。这可以计算出44个字符,除最后两个字符外,所有字符都是完全伪随机和独立的。)

-``usalt`告诉prpg,"我知道这个salt名为`example.com:username`,但您应该用另一个字符串来加密主密码。"如果,一个站点更改它的域名。

`` bash
~$prpg salts add'blub two point oh.com:mylogin'--json'{"\uu salt\uu":"blub.com:mylogin"}
~$prpg recall blub.com--print
selected salt:'blub.com:mylogin'
master:*****
efx332fc3617q1zaa0+
~$prpg recall blub two--print
selected salt:'blub two point oh.com:mylogin'
master:*****
efx332fc3617q1zzaa0+
````

(所有其他的双下划线键也为将来的铃声和口哨保留。所有非双下划线键都是公平的游戏。)

迭代次数=10**6))`
-默认后处理:取前16个字符,并附加"aa0+"(base64使用的每个字符类中的最低值base64个字符,即下/上/数字/标点符号,提出一个很好的schelling点)。只使用非常广泛的、精确指定的库函数,"受限于约束"必须在密码上受人尊重,"默认情况下必须满足大多数密码要求。"



为了您的拷贝粘贴乐趣:

*\python:

``python
import hashlib,base64


def master_和_salt_to_password(master:str,salt:str,postprocess=(lambda pw:pw[:16]+'aa0+))—>;str:
key=hashlib.pbkdf2廑hmac(
hash廑name=sha256',
password=master.encode('utf-8'),
salt=salt.encode('utf-8'),
迭代次数=10**6)
sha=hashlib.sha256(key.digest()
pw=base64.b64encode(sha).decode('utf-8')
返回后处理(pw)
```````
*\u node.js:

``javascript
crypto=require('crypto');
函数master和salttopassword(master,salt,postprocess=((s)=>;s.slice(0,16)+aa0+){
key=crypto.pbkdf2sync(master,salt,10**6,32,'sha256');
sha=crypto.createhash('sha256')
.update(key)
.digest();
pw=sha.tostring('base64');
返回后处理(pw);
}
````

*\javascript(对于网页):``javascript
///base64 js来自https://raw.githubusercontent.com/beatgammit/base64 js/master/base64js.min.js
function utf8encode{返回新的textcoder('utf-8').encode;}
函数masterandsalttopassword(master,salt,postprocess=((s)=>;s.slice(0,16)+'aa0+){
返回微妙的importkey('raw',utf8encode(master),{name:'pbkdf2',hash:'sha-256'},false,['derivekey'])。然后((master)=>;{
返回微妙的derivekey({name:'pbkdf2",salt:utf8encode(salt),迭代次数:10**6,hash:'sha-256'},master,{name:'hmac',hash:'sha-256'},true,['sign'])。然后((key)=>;{
返回smart.exportkey('raw',key)。然后((exp)=>;{
exp=exp.slice(0,32);
返回smart.digest('sha-256',exp).then((hash)=>;{
var encoded=base64js.fromtatearray(new uint8array(hash));
返回encoded.slice(0,16)+'aa0+';
};
};
};
};
}
````

*u ruby:

``ruby
需要'openssl'
需要'base64'
def master_和_salt_to_密码(master,salt)
key=openssl::pkcs5.pbkdf2_hmac('foo',bar',10**6,32,openssl::digest::sha256.new)
sha=openssl::digest::sha256.digest(key)
result=base64.encode64(sha)
返回(如果给定块?然后(产生结果)else(result.slice(0,16)+"aa0+")end)
end
`````

*\uuu haskell:\uuu

```haskell
--需要包"cryptohash"、"pbkdf"、"base64 bytestring","base16 bytestring"
导入crypto.pbkdf(sha256pbkdf2)
导入限定的crypto.hash.sha256作为sha256
导入限定的数据。bytestring.utf8作为utf8
导入限定的数据。bytestring.base64作为base64
导入限定的数据。bytestring.base16作为base16

defaultpostprocess::string->;string
defaultpostprocess s=(16秒)+"aa0+"

masterandsalttopassword master salt=(
utf8.tostring$base64.encode$
sha256.hash$
fst$base16.解码$utf8.fromstring$--bytes<;-hex string
sha256pbkdf2 master salt(10^6)32--hex string<;-args

````



欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javajexcel包装文本问题   EclipseJavaEnum缩进超过左括号。如何让它看起来更正常?   java有办法包含Tomcat 6 catalina。out和localhost。在网络应用的日志文件中记录内容?   java如何永久性地阻止JavaFX代码在eclipse中被突出显示为错误?   如何在java中优化两个for循环(for循环中的for循环)   java如何在我的windows机器上从jar文件创建mac osx的可执行文件   使用记忆化/动态规划的Java组合学   Java中的游荡对象垃圾收集   java为什么我在JSP和JDBC和MySQL中遇到连接失败错误   java轮询Pod的就绪状态   如何创建电子邮件并将其发送到Java中的特定地址?   java如何修复Dagger 2错误“。。。无法提供[…]”?   java Android单选按钮看起来太轻   Android Studio:开发在应用程序之间共享的通用java库