如何从客户端安全地发送密码

本文关键字:密码 安全 客户端 | 更新日期: 2023-09-27 18:25:07

我正在努力使我的REST API更加安全。目前,我正在用CryptoJs.SHA256在我的angular应用程序中散列我的密码,然后将其发送到我的C#后端。但我意识到最好在服务器端散列密码。那么,我如何发送一个只能由服务器读取的密码呢?我将添加SSL,但我知道HTTPS也是可破坏的。还有其他解决方案吗?

感谢

如何从客户端安全地发送密码

正如Bruce Schneier所说,"任何人都可以设计出自己无法破解的密码。这就是为什么你应该一致不信任业余密码学,也就是为什么你只应该使用经过广泛密码分析的已发表算法。"

虽然没有什么是100%牢不可破的,但破坏HTTPS比破坏JavaScript中的家常安全方案要困难得多。考虑一下:如果你通过不受信任的(HTTP或HTTPS,证书无效)连接提供超级安全的JS,是什么阻止攻击者替换损坏的版本,从而绕过所有JS安全?没有什么

现代浏览器正在竭尽全力防止HTTPS被破坏(使用HSTS等);因此,依赖HTTPS(在正确使用时可以提供实际的安全性-"忽略所有这些大的红色错误"是打破它的一种简单方法)比依赖HTTP上的JS(只提供安全感,而没有实际的安全机会)要安全得多。

进一步阅读:https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considered-harmful/

https://security.stackexchange.com/questions/3921/why-do-some-people-really-hate-security-via-client-side?rq=1

https://security.stackexchange.com/questions/8596/https-security-should-password-be-hashed-server-side-or-client-side

关于这个话题有很多消息来源,但很少有人真正分析过。一般来说,最信任托马斯·波宁的指导。我也强烈推荐我自己关于这个话题的调查和建议。

这并不是你问题的完整答案,但我会从使用KDF(密钥派生函数)开始,而不仅仅是散列你的秘密。您可以查看的一些KDF库有:

  • PBKDF2
  • bcrypt
  • scrypt

https://en.wikipedia.org/wiki/Key_derivation_function