螺旋包装
txscrypt的Python项目详细描述
txscrypt是scrypt的Twisted友好包装。scrypt 是一个键派生函数。这是你想用的东西 为了安全地存储用户的密码,如果您正在编写密码 存储库。(如果不是,请使用一个。)
如何存储密码?
很简单。
fromtxscryptimportcomputeKeyd=computeKey(password)d.addCallback(storeSomewhere)
computeKey是一个函数。你给它明文密码,在 字节。如果你的用户给你一个Unicode密码,编码它 第一。你会得到一个延迟的,在某个时候,用一个 神奇的字节串。储存起来。
好吧。如何检查密码?
fromtxscryptimportcheckPasswordd=checkPassword(stored,provided)
在这段代码中,stored是从computeKey得到的。 provided是用户提供的密码。给它同样的 在将密码传递给 computeKey。例如,如果是Unicode,则对其进行编码。
你会被推迟。在未来的某个时候 如果密码匹配,True,如果不匹配,False。
为什么神奇的字符串base64是编码的?
你不应该关心里面的东西。
它不完全是base64编码的,但它确实包含一些base64 编码部分。如果不是的话,它会有一堆nul字节和其他 它包含了大量的内容(即不可打印的ascii),这使得 存储材料结块。
如果您一定要知道,它看起来是这样的:
COMMENT:PARAMS:ENCODED_KEY:ENCODED_SALT
其中COMMENT当前总是txscrypt,PARAMS是 包含用于调用scrypt散列的参数的json对象 函数(n,r,p,buflen),ENCODED_KEY是base64编码的密钥, ENCODED_SALT是base64编码的salt。
早期版本的txcrypt使用了scrypt生成的原始字节。 一些第三方工具会在第一个nul字节后对这些字符串执行位操作。 不幸的是,这是紧接着“scrypt”这个词之后的 字符串的第一个字节。
但是盐呢?
txcrypt帮你处理这个。
(它使用操作系统计算足够长的盐) 密码安全的随机数生成器。目前,这个 长度为256位。)
但是定时攻击呢?
txcrypt帮你处理这个。
(它依赖于足够长的盐。可能有一面 与在同一个上多次执行scrypt相关的通道 但据作者所知 显示为攻击。)
但是让线程池饿死呢?
txcrypt帮你处理这个。
(它创建了一个新的线程池,仅用于在中运行scrypt。这意味着 scrypt不与dns解析等竞争 您传递给deferToThread。
但是关闭线程池呢?
txcrypt帮你处理这个。
(它告诉reactor在开始时停止线程池 关闭程序。那就意味着你必须有反应堆 为任何计算工作而运行。)
何时创建自己的包装器对象?
如果要更改:
- 盐的长度
- 线程池
- 任何默认的scrypt散列参数(n,r,p,buflen)
所以,基本上,从来没有。如果迭代次数不安全,请将 TXScrypt的错误,所以可以修改。
更改日志
3.0.0
与以前版本的更改不兼容!
内部格式现在存储参数,以便更改它们 (例如,升级迭代次数)将导致平滑 向前过渡。
2.0.1
自述文件更新和测试套件更新。
2.0.0
与以前版本的更改不兼容!
- 现在使用新公开的hash函数making密钥派生 完全确定。
- maxTime参数已被删除。
1.1.1
- 删除文档和 _全部
感谢matt haggard的错误报告!
1.1.0
- 仅在首次使用时启动线程池
- 当反应器开始关闭时停止线程池
1.0.0
与以前版本的更改不兼容!
- 删除不推荐的VerifyPassword API
- 对盐位使用较少的高质量熵
- 使用术语“盐”,与scrypt纸的一致性
- Base64s输出,防止其他软件被NUL字节阻塞
- 内部重写,更易于测试