如何在没有HTTPS的情况下使用Javascript通过HTTP安全地发送密码?

Vie*_*iet 58 security hash http password-protection hmac

所有开发人员都面临的一个非常基本的问题:每当用户提交表单时,密码都会通过网络发送,并且必须受到保护.我开发的网站没有HTTPS.所有者既不想购买SSL证书,也不想对自签名证书感兴趣.所以我想在提交表单时使用Javascript保护通过HTTP发送的密码.

渴望downvoters:如何通过HTTP安全地发送密码?不提供任何合理的解决方案,我处于另一种情况.

如果我使用MD5,可以反转该密码字符串.那怎么样的nonce/HMAC?任何可用的Javascript库吗?或者你有什么建议/提示要解决?提前致谢!

bob*_*nce 78

无法安全地发送密码,用户可以在没有SSL的情况下验证密码.

当然,您可以编写一些JavaScript,通过散列或公钥加密,使密码安全,实现线上传输.但是,用户如何确保JavaScript本身在到达它们之前没有被中间人篡改,将密码发送给攻击者而不是网站,甚至只是破坏了安全性.算法?唯一的方法是让他们成为专家程序员,让他们检查你的页面和脚本的每一行,以确保在输入密码之前它是犹太人.这不是一个现实的情况.

如果您希望密码免受中间人攻击,则必须购买SSL证书.没有其他办法.习惯它.

如果我使用MD5,可以反转该密码字符串.

不......至少不是琐碎的.虽然MD5对它有攻击,但它是一种哈希算法,因此是不可逆转的.你必须蛮力.

但同样,一个中间人攻击者不需要看你的MD5.他可以简单地破坏你发送给用户制作MD5的JavaScript.

  • <<虽然MD5对它有攻击,但它是一种哈希算法,因此是不可逆转的.你必须暴力破解它.>>你忘记了有预先计算的MD5密码哈希表,这意味着"暴力破解"可能很快而且微不足道. (6认同)

Sam*_*eff 24

这里的解决方案是根本不发送密码.使用挑战/回应.

在原始形式中包括一大块随机文本和一个键.根据服务器上的密钥将原始随机文本存储在会话中.当客户端提交表单时,使用JS将随机文本和密码一起散列.然后将用户名,密钥和散列随机文本发送到服务器.请勿发送密码.在服务器上,使用密钥查找原始随机文本,使用存储的密码执行相同的散列操作.如果服务器散列值与客户端散列值匹配,则您知道客户端输入了正确的密码,而没有将密码发送到服务器.

密码是否正确,密钥和随机文本到期,因此每个密码都是一次性使用.

  • @ZloySmiertniy,当您需要通过电子邮件提供密码重置时,最好发送重置密码的一次性链接,而不是自己发送实际密码.这可以防止密码的安全问题通过电子邮件传输并在以后存储在电子邮件中. (3认同)
  • 如果我是“中间人”,我只会捕获那个随机散列的字符串,并使用它进行身份验证,因此您在浏览器中所做的一切都无关紧要。通过在客户端和服务器上进行相同的散列,您刚刚向我展示了您如何在服务器端进行身份验证、您使用的是什么算法、通过了多少次等等。 (2认同)
  • @ xryl669是的,很好。这个问题和答案已有8年历史了,今天我不建议任何人运行没有https的网站,因为它现在比8年前更加普遍和便宜。 (2认同)

Mic*_*tum 12

如果您真的想深入研究这一点,请查看Diffie-Hellman密钥交换,该密钥交换是为了"允许彼此之前没有相关知识的两方在不安全的通信信道上共同建立共享密钥"而创建的

我不是加密专家,所以如果攻击者同时拥有客户端(JavaScript源代码)和传输机制(数据包嗅探器),我不完全知道它是否真的安全

  • 如果你做得对,这是安全的......但是做得对是非常困难的.SSL是方式,而不是工作. (7认同)

Sze*_*eri 5

您可以在发送之前使用javascript RSA实现来加密密码.(这是RSA在Javascript中的一个例子.)

但我相信这一个并使用哈希函数将容易受到重放攻击.所以,要小心.