繁体   English   中英

Java中的客户端和服务器端密码加密

[英]Client and Server side password encryption in Java

我正在使用Java / JSP创建一个小型社交网站。 我想先加密密码,然后将其存储在数据库中。 我想知道当今是否需要使用javascript(sha1,md5,..)加密客户端密码,然后将其发送到服务器,还是可以忽略客户端而仅在服务器端加密密码就足够安全了。

您需要通过TLS(SSL)在客户端和服务器之间传输密码。 然后,使用成本系数为16或更高的bcrypt (或具有64k迭代或更高的PBKDF2)在服务器上哈希密码。

如果您不使用SSL,则在使用Javascript进行客户端加密或哈希运算时会存在安全漏洞,因为中级攻击者可以在将页面传递给用户之前删除客户端哈希码。

如果您确实使用SSL,那么实现额外的客户端安全性将无济于事。 唯一有益的情况是,攻击者可以破坏加密,但不能破坏流的完整性(因此,他们只能嗅探数据)。 这似乎不太可能,但是有可能。

防止这种情况的额外安全性要求您首先对密码进行哈希处理,以匹配服务器对其进行哈希处理的方式(因此包括盐),然后使用服务器提供的随机生成的令牌对密码进行哈希处理(服务器还记得会话中的密码) 。 这样可以确保无法通过嗅探连接的人获得密码(前提是不损害流的完整性),并确保不能在重放攻击中使用哈希版本(随机服务器令牌会阻止其重用)。 如果仅由客户端自己对密码进行哈希处理,则没有什么可以阻止攻击者仅使用该哈希值来登录自己。 请记住,这是对SSL的补充,而不是代替SSL。

无论密码如何传输,都应仅在数据库中存储密码的盐化哈希版本。 理想情况下,使用每用户盐(也要存储)和安全哈希函数(例如SHA-2而不是SHA-1或MD5)。

最好的方法是使用:

  1. SSL
  2. 客户端和服务器端加密。

选项1通常就足够了,但是它仍然可以被监听,因此发送散列/加密版本会很有用。 但是,此发送的版本不应该是您存储在数据库中的版本,它应该具有某种其他的熵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM