我正在使用Java / JSP创建一个小型社交网站。我希望将密码加密,然后存储在数据库中。我想知道现在是否需要使用javascript(sha1,md5,..)加密密码客户端然后将其发送到服务器,或者它是安全的,可以忽略客户端并只加密服务器端的密码。
答案 0 :(得分:2)
您需要通过TLS(SSL)在客户端和服务器之间传输密码。然后,使用成本系数为16或更高的bcrypt
(或具有64k迭代或更多的PBKDF2)来在服务器上散列密码。
答案 1 :(得分:2)
如果您不使用SSL,那么在Javascript中进行客户端加密或散列将会出现安全漏洞,因为中间攻击者可能会在将页面传递给用户之前删除客户端散列代码。
如果您确实使用SSL,那么通过实施额外的客户端安全性几乎无法获得。唯一可能带来好处的情况是攻击者可以破坏加密而不是流的完整性(因此他们只能嗅探数据)。这似乎不太可能,但有可能。
防止这种情况的额外安全性要求您首先散列密码以匹配服务器散列的密码(包括盐),然后使用随机生成的令牌提供服务器(服务器也会记住)会议)。这可以确保嗅探连接的人无法获取密码(前提是流的完整性不受损害)以及确保散列版本不能用于重放攻击(随机服务器令牌阻止其重用)。如果您只在客户端自己散列密码,那么就没有什么可以防止攻击者只使用该散列值来登录自己。请记住,这是SSL的补充,而不是替代它。
无论密码如何传输,您都应该只在数据库中存储盐渍哈希版本的密码。理想情况下使用每用户盐(您也存储)和安全散列函数(例如SHA-2而不是SHA-1或MD5)。
答案 2 :(得分:1)
最好的方法是使用:
选项1通常已足够,但它仍然可以被嗅探,因此发送散列/加密版本会很有用。这个发送的版本不应该是你在数据库中存储的版本,它应该有某种其他的熵。