简单、强大和标准化的密钥密码存储

porridge的Python项目详细描述


#粥[![pypi](https://img.shields.io/pypi/v/porridge.svg)(https://pypi.org/project/porridge)[![构建状态](https://travis-ci.org/thusoy/porridge.svg?branch=master)(https://travis-ci.org/thusoy/porridge)[![Windows生成状态](https://ci.appveyor.com/api/projects/status/y51rewx877d522b5/branch/master?svg=true)(https://ci.appveyor.com/project/thusoy/porridge/branch/master)

泄漏可能通过SQL注入或受损的备份,或许多其他非常常见的WebApp漏洞发生。

急诊室最终能恢复大部分病人。粥使这完全不可能,除非你的秘密也被泄露,这通常不是许多常见漏洞的情况。

请注意,使用粥并不是解决Internet上密码的神奇方法,一个完整的解决方案至少还应执行密码策略,seCURE密码重置、速率限制和U2F/2FA。有经验的安全工程师为您设置了一些东西,或者使用高级库来为您处理这些东西。




从源代码构建需要cffi>;=1.0.0,而这又需要libffi和python头来编译。



----

``python
from porridge import porridge

porridge=porridge('myfirstkey:myfirstsecret')

boiled_password=porridge.boil('password')
如果是粥。请验证('password',boiled_password):
打印('success!')
其他:
打印('fail!')
```

此设置可确保即使数据库泄漏,用户密码也无法被不具有"myfirstsecret"值的攻击者恢复。像加载其他凭据一样安全地加载它,如api密钥、数据库密码、会话令牌和类似的凭据。

赖利。一段时间后,它看起来像


列表中的第一个密钥(在本例中,keyid3)将用于生成新密码。

ed.当不再有用户使用该ID的密码时,可以从配置中删除机密,这可以从煮沸密码中的"keyID"字段中辨别出来。

**注意**:创建一个"porridge"实例并在整个应用程序中重新使用它,它会执行一些参数验证和其他操作启动您不希望对处理的每个密码都重做。





——


我找不到任何利用argon2服务器端机密功能的现有解决方案,因为大多数库只包装高级接口,遗憾的是,这些接口不支持设置机密。

配置加密参数
-ux是一项安全功能
-数据库不受信任,既不保密,也不保持正常
-只遵循快速启动应该会导致非常安全的实现
-从现有解决方案迁移应该e易于维护r/>——

r/>
首先要确保,如果您的服务器在某一点受到损害,未来的密码不会受到影响。

第二点确保每次您的用户登录时,其现有的煮沸密码所存储的参数仍然是强的,并且是保密的,否则将被重新存储。

已经过验证,如果是这种情况,则存储更新的密码:

`` python
来自porridge import porridge

porridge=porridge('keyid2:key2,keyid1:key1')

password=…#从用户那里获取这个
old_boiled_password=…#从数据库中获取

if porridge.verify(password,old_boiled_password):
print('success!')
如果粥。需要更新(旧的煮过的密码):
更新数据库中的密码
新的煮过的密码=粥。煮过的(密码)
打印("将新的煮过的密码存储到数据库")
否则:
打印("失败!")
```

比它自己的参数的给定阈值还要小。这是为了确保,如果你不小心试图用数百万的时间成本或内存成本来验证密码,你就不必等待宇宙的热死来重新控制你的计算机。但我们也希望确保我们可以在一组实例中逐步升级参数,而不会有一些实例突然出现故障,因此,当您增加成本参数时,应确保将它们增加到小于"parameter_threshold"的值。默认阈值为4,因此,如果您使用两个参数,就可以了,但是如果您希望将参数凹凸到4倍以上,则应首先在整个车队中增加"默认阈值"。



faq
--

*q:我注意到porridge不太使用"hash"一词,为什么?*
a:因为与非密码学家(包括我们大多数人)交流时,很容易出错。有经验的密码学家在密码上下文中会将"散列"心理转换为"内存硬键拉伸",但我们其他人不会这样做。因此,对于非密码学家来说,编写密码存储解决方案太容易了,要么用明文存储密码,要么只使用实际值。l"散列",导致小狗左右死亡。因此,对于粥来说,密码是"煮"出来的。如果非密码学家听说他们应该煮密码,任何像样的搜索引擎将确保他们最终得到一个非常健壮的解决方案。这个项目被命名为粥,因为它是一道需要盐和长时间煮沸的菜,但也避免蹲下一个"密码锅炉"包,使其他包很难试图解决同样的问题。Eran Hammer对此有一些[更多的想法](https://hueniverse.com/the-myth-of-descriptive-module-names-d34d5feaa273)。

*q:我如何从pbkdf2/bcrypt/scrypt/plain argon2迁移到粥中?*
a:在数据库中添加一个新列以存储煮沸的密码,在现有方案的基础上添加粥和煮沸的密码,并将它们存储到新列中。验证时,如果新列中有任何内容,请同时验证现有方案和porridge。当你认为没有足够多的用户还没有得到他们的密码煮粥,放下旧的密码栏,停止使用旧的方案。用户没有得到新的煮过的密码将强制通过密码重置,否则没有人会注意到任何差异。如果您已经在使用argon2,但没有服务器端的秘密,可以直接加入粥。请注意,煮沸密码的最大长度为*265*个字符,但这需要使用未通过porridge公开的相关数据功能,因此,如果现有列只允许255个字符,那么您可能就没事了。

*q:为什么是"porridge"?*
a:因为好的粥不仅需要盐,而且需要很长时间才能煮熟,煮熟后你无法将其成分分开。当我开始写这个的时候我很饿。我们需要更好的密码存储术语,请看第一个问题。

*q:您能为X平台释放轮子吗?*
a:所有发布的粥都使用由travis ci和appveyor构建的轮子(参见`./tools/release.py`了解其工作原理)。如果您需要另一个支持的平台,比如某个平台上的pypy的特定版本,打开一个pr将其添加到构建矩阵中,它将自动成为下一个版本的一部分。




security
--


porridge包装了[argon2]的引用实现(https://github.com/p-h-c/phc-winner-argon2),password散列竞争,这意味着它已经被非常有经验的密码分析员详细研究过。


默认参数的目标是~1毫秒的沸腾时间和512 KB的内存使用量,调整这些参数以适应您的环境和您的要求。如果你运行在高性能的硬件上,你应该能够承受更高的成本:

``python
porridge=porridge('key1:secret1',time\u cost=8,memory\u cost=1024,parallelism=16)
````

`time\u cost`给出核心算法的迭代次数,衡量一下它对环境的影响。
`memory\u cost`是多少为每个煮沸的密码使用kibibytes的内存。
"parallelism"是为每个煮沸的密码使用的线程数。

如果您发现一个安全关键错误,而您不想在这些问题中公开披露,请发送电子邮件至thusoy.com。此项目没有错误奖励,但您将(如果您愿意)在自述文件和更改日志中获得信任。



要在其他方案中使用服务器端机密,您可以在将密码传递给密钥拉伸功能之前将其与密钥hmac一起使用,但是在不使所有密码无效的情况下很难旋转此机密。



credits
----


很多都要感谢gre的[argon2 cffi](https://github.com/hynek/argon2 cffi)在包装argon2的起点处。



疑难解答
----


ile:没有这样的文件或目录
```

您可能缺少"python dev"包。在ubuntu/debian/ubuntu/debian上:` sudo apt-apt-apt-get-install python dev `。








`安装失败,编译终止。

` `
` ` ` ` ` ` ` ` `
c//c ffi cffi ` `.c:15:17:致命错误:ffi.h:ffi.h:fatal错误:ffi.h:无此类文件或目录


包括ffi.h<;ffi.h>;



<编译TE终止。

错误:命令"x86_64-linux-gnu-gcc"失败,退出状态为1
````

您试图从源代码安装(如果使用未安装manylinux1轮的旧PIP,则可能发生这种情况),编译器找不到所需的库。在ubuntu/debian上:`sudo apt get install libffi dev python dev`。更新你的PIP也应该如果在virtualenv中运行,则可能不需要根目录。




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

推荐PyPI第三方库


热门话题
JavaBeanio如何将抽象类或接口映射为记录或段   java Jboss 4.2.2到Jboss 7.1.1的迁移问题   如果Java运行时高于给定版本,则强制Maven失败   java在部署时持久化实体   java如何使用jdatechooser从mysql数据库中保存和检索空日期   java Google Drive SDK如何获取文件所在的文件夹?   java使用spring mvc mybatis从oracle db获取失败用户登录结果的数量   数组如何在java中拆分数字文件?   创建对象期间出现安卓 Java空指针异常   java 安卓supportv4。jar在Eclipse中未正确导入   java如何在javafx中创建这种类型的按钮   关于Spring集成和原型范围的java之谜   java正则表达式:在2个标记之间提取DNA信息   使用getText()时出现java空指针异常。toString()。修剪();   java如何从spring控制器获取angularjs中的模型属性值