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

时间:2015-11-30 13:56:12

标签: javascript c# api rest security

我正在尝试使我的REST API更安全。目前我正在使用CryptoJs.SHA256在我的角度应用程序中对我的密码进行哈希处理,然后再将其发送到我的C#后端。但我意识到在服务器端散列密码更好。那么如何才能发送只能由服务器读取的密码?我要添加SSL,但我知道HTTPS也是易碎的。还有其他解决方案吗?

谢谢

3 个答案:

答案 0 :(得分:4)

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

虽然没有什么是100%牢不可破的,但打破HTTPS要比打破JavaScript中的家庭式安全方案要困难得多。请考虑这一点:如果您通过不受信任的(HTTP或HTTPS与无效证书)连接提供超级安全的JS,那么是什么可以阻止攻击者替换破坏的版本,这将绕过所有JS安全性?什么都没有。

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

进一步阅读: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

答案 1 :(得分:0)

关于这个主题有很多来源,但很少有人真正分析过它。作为一般规则,Thomas Pornin的信任指导比其他人更多。我也强烈推荐my own survey and recommendation on the topic

答案 2 :(得分:0)

对于您的问题,并不完全是一个完整的答案,但我首先考虑使用KDF(密钥派生函数),而不是仅仅挖掘您的秘密。您可以查看的一些KDF库是:

  • PBKDF2
  • bcrypt
  • scrypt

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