【发布时间】:2023-06-01 09:15:02
【问题描述】:
我正在创建一个基于 PHP 的 CMS(使用 MVC 架构)。我想散列存储在数据库中的用户密码。我已经阅读了很多关于这个主题的文章和教程,但我遇到了反对意见/观点和建议。我有点困惑。我正在寻找实现密码散列的最佳方法。这些是我遇到的概念/方法:
首先,许多人混淆了单向散列和两向加密。如果我没记错的话,2路加密是关于使用公私钥对的不对称加密的事情,它是为了保护数据并使其只有知道另一个密钥(密钥)的人才能读取。所以这是我们现在不关心的。
PHP 提供了许多函数来制作哈希,其中一些直接对给定数据使用哈希算法(md5()、sha1()、sha256()、ripemd160() 等)其中一些接受给定数据并支持的算法并生成哈希(hash()、hash_init()、hash_hmac() 等)
散列/加密方法的负载有什么区别? (hash_pbkdf2()、crypt()、bcrpyt、password_hash() 和上面提到的其他人)
据我所知,在散列中使用盐是一种好习惯,但多次散列是一个坏主意(即使有很多人认为它是好的)。有些函数使用盐,有些函数使用密钥...
问题 1:
有人能澄清一下例如:md5('myPassword'); 和hash('md5', 'myPassword'); 之间的区别吗(我知道 md5 是一种易于破解的方法,不建议用于存储密码)
问题2:
key 和 salt 有什么区别?那么hash_hmac('sha1', 'myPassword', 'HaCK_MeIF_youCAN'); 和sha1('myPassword'.'HaCK_MeIF_youCAN'); 有什么区别呢?
(注意hash_hamc 调用它的第三个参数'key')
问题 3: 多重哈希真的是一种不好的做法吗? 喜欢:
hash = sha512(password)
for i in range(10000):
hash = sha512(hash) + salt
return hash
问题 4: 散列密码的最佳方法应该是什么?
由于这是一个重要且敏感的问题,我认为像我这样不熟悉该主题的其他人希望将这个哈希问题弄清楚,并希望一劳永逸地获得准确可靠的答案,我请您回答如果您是 IT 安全专家,或者您拥有该主题的任何证书或学位! (对于在互联网上获得知识的自称安全专家:您使用散列密码完成数百个系统/网站的事实并不意味着它们是安全的!)
最后一个要求: 简单的(初学者)网络程序员既不是外星人,也不是理论数学家。所以请尝试用一些类似人类的英语来解释:)
【问题讨论】:
-
问题4:使用
password_hash或其兼容库。这是一个易于使用的 bcrypt 包装器。 -
另见 Openwall 的 Portable PHP password hashing framework (PHPass)。它强化了对用户密码的一些常见攻击。
标签: php security encryption hash