我想出了这个理论,以避免密码窃取形式的POST嗅探。 想法是连接一个salt字符串(在php session_start()上随机生成)。
请注意,salt_hash是在每次访问时随机生成的...它不是在客户端计算的。
基本上JS代码将添加到HTML中:
<script>
var salt_hash='654236426556424655643645462321560356';
</script>
然后在发布之前,我计算......
cryptoPass = md5(md5(password)+salt_hash);
passowrd = ''; // clear user password input
submit POST...;
然后在login.php上我将$ _POST [&#39; cryptoPass&#39;]与md5(用md5存储的MySQL用户密码加上salt_hash)进行比较
它真的有用还是无意义理论?
答案 0 :(得分:5)
首先,我将以旁注开头,安全性的第一条规则是永远不要尝试制作和使用自己的加密。有些专业人士非常善于制作cryto算法,人们仍然可以破解它们。
您的方案实际上并没有为该方案增加那么多安全性。如果攻击者知道您正在计算哈希:
cryptoPass = md5(md5(密码)+ salt_hash);
然后,如果他们知道盐值,他们可以使用相同的算法蛮力。这几乎没有增加任何安全性,因为它几乎需要同时破解:
cryptoPass = md5(密码+盐);
这两种破解算法都是一样的。它们是同一时间的复杂性。您只是使用两种不同的函数进行散列。
这里最好的解决方案就是使用TLS,这很容易实现。
客户端100%安全插入任何内容 的概念是不现实的。不幸的是,没有办法确保100%的东西。如果人类制造它,那么有足够的时间,人就可以破解它。
为什么在客户端使用散列+ salt作为加密机制很糟糕:
让我们假设你使用RANDOM哈希,就像你提到的那样。客户端启动服务器的登录序列,服务器向其发送salt值:
718904732197
攻击者现在知道盐值。现在,客户端使用散列函数散列他/她的密码:
cryptoPass = md5(md5(密码)+ salt_hash);
salt哈希是随机的,但已知,算法也是如此。由此攻击者使用简单的强力算法破解哈希(破解简单的6位密码需要几秒钟)。他们还可以使用彩虹表和字典攻击哈希来提高破解速度。
攻击者将使用您已知的函数生成哈希值:
cryptoPass = md5(md5(密码)+ salt_hash);
他们已经知道盐的价值了。他们将使用暴力从哈希中提取密码。现在他们有明文密码,可能还有用户名,现在他们可以登录该用户的帐户。
也许这对你有帮助:
这比不安全更好吗?是
散列+盐比单独散列更好吗?是
使用随机盐值更安全吗?是的,在某种程度上。
除此之外,您使用的方案并不符合当今的标准。一个经验丰富的破解者可以在几个小时内找到你的整个算法。