客户端使用时间盐值的MD5哈希

4
我希望在JS中用高阶时间值(<1分钟分辨率)给已哈希的用户名和密码(通过http POST提交)加盐,以避免将用户名和密码哈希作为常量值发送到未经授权用户(即嗅探器)可能用于POST伪造的登录尝试。
这将对传递的哈希值的有用性施加短期有效期。如果他们检查JS并看到它使用此时间盐,那么如果他们知道盐是什么,这会让破解MD5更容易吗?
史蒂芬
4个回答

3

盐不需要保密。从这个意义上说,你的解决方案是可以的。

在某些应用程序中,MD5已经被破解;这个可能还好,但为什么不使用SHA-2家族的哈希呢?此外,为什么不使用SSL提供机密通道和更好的安全性呢?


你回答了我的一个基本问题,即通过使盐可知来削弱哈希的使用。大家都同意吗?我可能会使用SHA-2,MD5只是一个例子。我试图避免使用SSL,原因我将在另一个问题中发布。 - Stephen
参见:https://dev59.com/F3I-5IYBdhLWcg3w18Z3#1645190 - Jacco

2
基于时间的盐并不会使MD5更容易被破解。您仍然依赖于以下两点:1)用户使用强密码以抵御暴力破解算法,2)MD5是一个不错的哈希函数。这就是您问题的基本答案。然而,这可能也不是一个好主意。一些评论如下:
除非您能确保客户端或服务器的时间同步(或者您使用Javascript来伪造同步),否则客户端必须发送其所使用的时间作为盐值。服务器必须决定所使用的时间是否足够接近服务器的时间。
即使进行了同步,由于互联网的延迟,您可能还需要接受加减一分钟左右的哈希值误差。另一个问题是,如果我在嗅探网络,只要我仍然在这个时间窗口内,我就可以立即重用这个哈希值。
由于上述问题,更好的想法是在哈希值中使用一次性由服务器分配的盐值,因为您似乎不想使用SSL。换句话说,每次向客户端发送登录表单时,服务器都会生成一个随机、唯一的盐字符串,并将其发送到客户端,同时跟踪这是一个可接受的盐值。然后客户端使用该盐值与密码一起使用。提交一次后,服务器将放弃此盐字符串作为可接受的盐值。没有两个哈希值应该是相同的。这种方法的缺点是您必须跟踪这些可接受的盐字符串。

时间是一次性的盐。当我说高阶时间时,我的意思是我会忽略秒数,因此我只需要确保服务器在表单提交后60秒内收到请求即可,所以我不需要同步。我会给你发送另一个评论。感谢反馈! - Stephen
时间不是一次性盐,它限制了攻击者可以攻击的时间,但可以在时间窗口内反复重用。如果我嗅探到一个 wifi 连接并看到有人登录您的网站,我可以立即使用自己的电脑登录,冒充他们。 - TorgoGuy
是的,您确实需要同步。如果服务器的时钟显示为12:20pm,而我的客户端计算机时钟显示为12:15pm,则如果您不接受至少5分钟窗口期内的哈希值,我将无法登录。 - TorgoGuy

1
他们的工作将变得不可行,因为如果哈希值被正确地加盐,就无法使用彩虹表,而且在不到一分钟的时间内无法破解MD5,而此时哈希值已经失效了。

这就是我一直在考虑的问题:知道盐值是否会让使用彩虹表更容易。很快你就能够在一分钟内破解MD5了。也许我需要像小于1小时这样更高次序的时间来应用这个想法。谢谢。 - Stephen

-2

您可以使用代码混淆来使盐更难被发现


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接