Cri*_*tin 10 python security passwords
我正在创建一个用户+密码的软件.在识别之后,用户可以访问一些半公共服务,但也加密一些只有用户可以访问的文件.
如果可能,用户必须按原样存储,无需修改.在auth之后,只要软件正在运行,用户和密码就会保存在内存中(我不知道是否可以).
问题是我应该如何将这个用户+密码组合存储在一个可能不安全的数据库中?
我真的不明白我应该揭露什么.
假设我创建了一个这样的增强键:
salt = random 32 characters string (is it okay?) key = hash(usr password + salt) for 1 to 65000 do key = hash(key + usr password + salt)
我应该在数据库中存储[纯文本用户],[增强密钥]和[盐]吗?
另外,我应该使用什么来加密(使用AES或Blowfish)每次使用新密码的某些文件?我应该生成一个新的盐并使用(存储在程序的内存中的密码+盐)创建一个新的增强密钥?在这种情况下,如果我将加密文件存储在数据库中,我应该只存储盐.数据库与我存储用户+密码组合的位置相同.
如果有人可以生成密钥,则只能对文件进行解密,但他不知道密码.对 ?
我使用Python和PyCrypto,但它并不重要,一般的例子就好了.我已经阅读了一些类似的问题,但它们并不是很明确.
非常非常感谢你!
Die*_*Epp 10
加密很难做对,你问问题是好的.
存储密码:应使用密钥拉伸算法对密码进行哈希处理.通常,您希望使用库而不是自己实现它.密钥拉伸算法旨在咀嚼处理器周期,因此用漂亮的C代码评估它们是很好的.如果您使用的是Linux系统glibc,则可以使用该crypt.crypt模块(读取man crypt):
import crypt
encrypted = crypt.crypt(password, '$6$' + salt + '$')
Run Code Online (Sandbox Code Playgroud)
这将返回一个ASCII字符串,您可以安全地将其存储在数据库中.(这$6$是一个glibc扩展,使用基于SHA-512的键拉伸功能.如果你没有这个扩展,那么不要使用crypt.crypt).(编辑:该算法与您在问题中提到的算法非常相似.但是,最佳做法通常是让图书馆执行这些操作而不是自己编写.)
加密文件:不要自己这样做.安装GnuPG(或scrypt,bcrypt,ncrypt,你有什么).当您设计自己的加密文件方式时,有一些事情很容易出错.这些工具使用正确的密钥派生函数,身份验证哈希值和密码模式,无需任何其他配置.它们不是Python库,而是可执行文件,因此您必须编写使用该subprocess模块的包装器.
内存中的密码:不要.根据密码数据库检查用户密码后,使用密钥派生函数将密码转换为密钥.然后,您可以使用该密钥来解锁加密文件,但您无法再使用它来获取原始密码.