首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否应该使用generate_password_hash()将所有加密密码存储到数据库

是否应该使用generate_password_hash()将所有加密密码存储到数据库
EN

Stack Overflow用户
提问于 2016-09-03 08:00:10
回答 2查看 1.2K关注 0票数 0

当我使用generate_password_hash()函数时,我得到一个包含随机盐的加密密码字符串。

代码语言:javascript
复制
>>> from werkzeug.security import generate_password_hash, check_password_hash
>>> generate_password_hash('password')
>>> 'pbkdf2:sha1:1000$3j8Brovx$9acddcd67da9e4c913817231c882a0f757e2d095'

如果我将这个字符串存储到数据库中,其他人入侵了我的数据库并得到了这个字符串,就很容易使用蛮力破解获得原始密码,因为加密的密码包含salt。

代码语言:javascript
复制
check_password_hash('pbkdf2:sha1:1000$9HycZ0Qa$94f08a91fba1c040c5bffb6c7e1ab5a6ad4818de', 'password')

在使用generate_password_hash()之前,我应该先使用自己的salt加密原始密码,还是有更好的解决方案?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-03 08:41:25

使用蛮力破解很容易获得原始密码,因为加密的密码包含salt。

不,这是“很容易”的暴力,因为你有一个低的迭代数1000。

在使用generate_password_hash()之前,我应该先使用自己的salt加密原始密码,还是有更好的解决方案?

不,加密是可逆的,因为丢失的数据库也意味着加密密钥可能也丢失了,这意味着额外的加密是无用的。

一个简单的解决方法是将迭代次数增加到一百万或一千万次,这取决于您能够负担得起的服务器上的用户不会因为认证过程缓慢而逃跑。

代码语言:javascript
复制
generate_password_hash('password', method='pbkdf2:sha256:1000000')

PBKDF2的问题在于它可以很容易地并行化,因为它不需要太多内存。还有一些替代方案,如scrypt和Argon2,它们可以配置为需要大量内存。内存是基于ASIC的专用密码强制机器的主要限制。

最终,如果您的用户使用"password1“作为他们的密码,任何事情都不会导致安全的身份验证系统。您应该要求用户使用至少12个字符的复杂密码,包括大写字母、小写字母和数字(可选包括特殊字符)。这些也不应该成为词典的一部分。

见更多信息:How to securely hash passwords?

票数 2
EN

Stack Overflow用户

发布于 2016-09-03 12:02:33

当您存储密码散列时,主要假设是使用蛮力检索密码太困难了。如果您希望它更安全,请选择更慢的哈希算法和更长的密码。

加密比散列更糟糕,因为哈希是不可逆转的,暴力是检索密码的唯一方法。有了加密,蛮力只是其中一种选择。

一旦这是明确的,您可以选择在代码中有一个“秘密”盐,或者可以使用哈希保存salt。用密码保存盐更安全!为什么?因为每个密码都有不同的盐,所以入侵者必须分别强制每个密码。如果您有一个全局盐值,则可以一次性对数据库中的所有密码执行蛮力操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39304650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档