ASP Classic 中最慢(因此最好)的密码哈希算法是什么?
编辑:对于那些不知道的人,在散列密码时,较慢的散列比更快的散列更能帮助减缓彩虹表样式的攻击。
EDIT2:是的,当然速度不是哈希选择的唯一有效问题。我的问题假设在所有其他条件相同的情况下,在散列密码时首选最慢的散列方法。虽然碰撞/逆向工程当然也是一个问题,但我在这个问题中优先考虑速度,因为它可以说是比较流行的哈希算法用于密码时要考虑的最关键因素。
谢谢!
ASP Classic 中最慢(因此最好)的密码哈希算法是什么?
编辑:对于那些不知道的人,在散列密码时,较慢的散列比更快的散列更能帮助减缓彩虹表样式的攻击。
EDIT2:是的,当然速度不是哈希选择的唯一有效问题。我的问题假设在所有其他条件相同的情况下,在散列密码时首选最慢的散列方法。虽然碰撞/逆向工程当然也是一个问题,但我在这个问题中优先考虑速度,因为它可以说是比较流行的哈希算法用于密码时要考虑的最关键因素。
谢谢!
很多人似乎都在质疑提问者,因为他正在寻找一个缓慢的哈希函数。实际上,在所有其他方面相同的情况下,较慢的散列函数比快的散列函数更安全。这是因为较慢的散列函数会导致彩虹表的生成速度较慢,并对密码进行较慢的暴力破解或字典攻击。
来自http://www.securityfocus.com/blogs/262上的Thomas Ptacek,在此Coding Horror 文章中引用:
问题是MD5 速度很快。它的现代竞争对手也是如此,例如 SHA1 和 SHA256。速度是现代安全散列的设计目标,因为散列是几乎每个密码系统的构建块,并且通常在每个数据包或每个消息的基础上按需执行。
速度正是您在密码哈希函数中不想要的。
现代密码方案受到增量密码破解程序的攻击。
增量破解者不会预先计算所有可能的破解密码。他们单独考虑每个密码散列,并通过密码散列函数提供字典,就像您的 PHP 登录页面一样。像 Ophcrack 这样的彩虹表破解器使用空间来攻击密码;像 John the Ripper、Crack 和 LC5 这样的增量破解者使用时间:统计和计算。
密码攻击游戏以破解密码 X 的时间计分。对于彩虹表,该时间取决于您的表需要多大以及搜索速度有多快。使用增量破解程序,时间取决于您可以使密码哈希函数运行多快。
你可以更好地优化你的密码哈希函数,你的密码哈希函数得到的越快,你的方案就越弱。MD5 和 SHA1,甚至像 DES 这样的传统分组密码,都被设计成速度很快。MD5、SHA1 和 DES 是弱密码哈希。在现代 CPU 上,像 DES 和 MD5 这样的原始加密构建块可以进行位切片、矢量化和并行化,以使密码搜索速度快如闪电。Game-over FPGA 实施仅需数百美元。
PHP MD5 文档的一些评论也讨论了对慢的偏好。
要回答您的问题,BCrypt 似乎是要走的路。但是,我还没有找到 ASP Classic 的任何实现。如果这是真的,我会坚持使用像 SHA512 这样的常规哈希函数。
我会忽略慢的部分,而是选择“好”的部分。
我建议您使用带有盐的 SHA-512 来击败字典和彩虹表攻击。我不相信 SHA-512 存在任何已知漏洞。
如果您试图击败蛮力攻击,您最好强制执行一些失败的尝试窗口/计数,而不是依靠散列(或散列比较)机制的速度来使攻击需要更长的时间才能成功。在失败窗口内尝试一定次数的失败后锁定帐户,并且仅在经过大量时间后才允许进行新的尝试。
这可能会使您面临针对知名(管理)帐户的 DOS 攻击,但您可以将某些帐户从锁定策略中排除,或者使用另一种方法(使用安全问题/答案)登录到锁定的帐户重置期过去之前的帐户。
[编辑]为了帮助击败彩虹攻击——攻击者已经检索了你的散列密码并找到散列到相同值的合适匹配项——考虑使用每个用户的散列密码唯一的随机盐和作为一部分的固定盐算法,而不是数据。例如:
testHash = computeHash( user.salt + "98hloj5674" + password );
if (testHash == user.hashedPassword)
{
valid = true;
}
这应该使彩虹表无效,因为即使知道用户的盐和散列算法,攻击者彩虹表中的值也不会映射到您的散列密码,因为在算法中添加了固定盐。
使用 ASP Classic,您必须在库中而不是在页面上执行此操作,以确保用户看不到您的固定盐。
Dim sPassword, sSalt
sPassword = "Lorem"
sSalt = "Ipsum"
With CreateObject("CAPICOM.HashedData")
.Algorithm = 0 ' CAPICOM_HASH_ALGORITHM_SHA1
.Hash sPassword & sSalt
Response.Write "Here is your hash: " & .Value
End With
算法是以下任何一种:
CAPICOM_HASH_ALGORITHM_SHA1 = 0
CAPICOM_HASH_ALGORITHM_MD2 = 1
CAPICOM_HASH_ALGORITHM_MD4 = 2
CAPICOM_HASH_ALGORITHM_MD5 = 3
CAPICOM_HASH_ALGORITHM_SHA_256 = 4 - Not supported on Windows XP or 2000
CAPICOM_HASH_ALGORITHM_SHA_384 = 5 - Not supported on Windows XP or 2000
CAPICOM_HASH_ALGORITHM_SHA_512 = 6 - Not supported on Windows XP or 2000
我个人更喜欢Whirlpool 算法来满足我所有的散列需求。它产生一个 512 位的输出,因此具有与 SHA-512 相同的空间要求。遗憾的是,我不能权威地谈论一个是否比另一个更安全,但在这个第三版的 Whirlpool 中似乎没有任何明显的弱点。
参考实现在公共领域,这很好,因为我很少发现它在各种工具和语言中默认实现。
(如果有人知道为什么 SHA 比 Whirlpool 更受青睐,请告诉我。)
实际上,最好的散列函数是不产生碰撞并且不会被彩虹表攻击怀疑的散列函数。
这意味着:添加一个 Salt(最好为每个用户使用不同的 Salt),并考虑使用 SHA2 哈希函数(或者可能是 RIPE-MD,我没看过那么多):
SHA-256 的一种实现在这里(我喜欢他们称之为“单向加密”):
http ://www.freevbcode.com/ShowCode.Asp?ID=2565
虽然还没有测试过,但是经典 ASP 肯定有 SHA2 实现。
最慢方法的伪代码:
function hashPassword(password)
sleep for 10 seconds
return password
end function
这当然不是最安全的(或根本不是),但它很慢......
(我只是指出让它变慢不是答案......)