- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 friend 是白帽黑客。他说 md5 并没有那么糟糕,而且实际上非常安全,只要我们正确使用它。
我相信他是对的。据我所知,有 3 种方法可以打破散列:
// return a 256 bit salt + 128 bit md5 binary hash value
function hash(password, salt=null)
{
salt = (salt != null) ? salt : Random256BitBinaryValueGenerator();
// What about using another user-specified parameter, like email address as salt?
return salt + md5(salt + password) + md5(password + salt);
// Or just use a non-cryptographic hash algorithm like crc32 to prevent collisions:
// return salt + md5(salt + password) + crc32(salt + password);
// Or even use two different salts:
// return salt + md5(salt + password) + md5('C' + salt + password);
}
// check password
function check(password, hash_value)
{
return hash(password, substring(hash_value, 0, 32)) == hash_value;
}
最佳答案
collision resistance MD5的属性已经被破坏了很长时间。请注意,preimage resistance和第二个原像阻力尚未破解,但是由于有更好的算法(SHA-2),因此转向这些算法而不是依赖已经开始失去其加密特性的加密哈希是明智的。注意:在存储散列密码时,抗碰撞属性无关紧要 - 您需要确保原像抗性属性是可靠的 - 在给定某个散列值(和盐)的情况下,找到原始密码在计算上是不可行的。正如我所提到的,由于其中一个加密特性已经被破坏,我担心其他加密特性会很快跟进。
当您存储密码哈希时,您应该建立一些保护措施,防止攻击者设法提取这些哈希时无法检索原始密码。这很重要,因为如果攻击者设法仅检索密码表,他们就可以使用这些数据直接登录您的系统,或登录用户重复使用相同密码的其他系统。
存储密码时,使用慢算法很重要,例如 bcrypt、scrypt 或 pbkdf2。合法用户在第一次登录时应该只需要经历一次延迟。攻击者将不得不经历他们猜测的每个密码的延迟 - 请记住,这里不会使用彩虹表,因为密码是加盐的。攻击者将根据您选择的算法和迭代次数对每个密码猜测进行哈希处理。
为您的系统调整迭代次数非常重要,以便使用正确的“强度”不会在登录您的系统时给合法用户带来任何真正的烦恼。这被称为“轮次”或“迭代次数”。例如,迭代大约一秒钟就足够了。可以安全地假设攻击者可以以系统硬件速度十倍的速度运行散列。因此,这将攻击者限制为每秒 10 次猜测,而不是使用 MD5 进行 20 亿次猜测。
关于 DoS 攻击
是的,您的应用程序在登录前执行的额外处理可能是攻击者向您的应用程序提交非常长的密码,或者通过登录请求反复访问它以消耗服务器上的 CPU 和内存资源的目标。 You are right to be concerned .
可以通过以下方式缓解这些类型的攻击:
关于security - 为什么不使用 MD5 进行密码散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30496061/
我是一名优秀的程序员,十分优秀!