我想在客户端的 JS 中使用更高阶的时间值(< 1 分钟分辨率)对散列的用户名和密码(通过 http POST 提交)加盐,以避免将用户名和密码散列作为常量值发送,这可能是用于未经授权的用户(即嗅探器)通过 POST 制造的登录尝试。
这将对传递的哈希的有用性施加短暂的到期。
如果他们检查 JS 并看到它使用了这次的盐,如果他们知道盐是什么,那么破解 MD5 的工作会容易多少?
斯蒂芬
基于时间的盐不会使 MD5 更容易破解。您仍然依赖 1) 具有良好密码的用户来击败暴力计算,以及 2) MD5 是一个不错的哈希值。这是您问题的基本答案。但是,无论如何,这可能不是一个好主意。一些评论——
除非您可以确保客户端或服务器的时间是同步的(或者您使用 Javascript 来伪造同步),否则客户端将不得不发送它用作盐的时间。服务器必须决定使用的时间是否足够接近服务器的时间。
即使同步,由于 Internet 上的延迟,您也可能不得不接受正负一分钟左右的哈希值。另一个问题是,如果我在嗅探,只要我还在这个时间窗口内,我就可以立即重用这个哈希。
由于上述问题,一个更好的想法是使用带有哈希的一次性服务器分配的盐,因为听起来您不想使用 SSL。换句话说,每次向客户端发送登录表单时,服务器都会生成一个随机的唯一盐字符串,将其发送给客户端并跟踪这是一个可接受的盐。然后客户端将其用作带有密码的盐。提交一次后,服务器将其丢弃为可接受的盐字符串。没有两个哈希值应该是相同的。这样做的缺点是您必须跟踪这些可接受的盐字符串。
他们的工作将变得不可行,因为如果哈希正确加盐,您根本无法使用彩虹表,而且您不能在不到一分钟的时间内破坏 MD5,届时哈希无论如何都会失效。
您可以使用代码混淆使盐更难找到