2011-03-29 65 views
0

我试图在现有的应用程序上实现随机salt md5算法。用户密码作为md5散列存储在数据库中。对于现有用户以下步骤之后随机salt md5实现,包括新的注册/更改密码

在客户端(JavaScript)

client_password = md5(md5(plain_password) + random_salt) 

在服务器端

server_password = md5(md5_password + same_random_salt), 
check client_password to server_password 

我努力寻找解决方案来存储用户的md5密码,而不在数据库盐对于更改密码的情况。

感谢

+0

第100次停止使用MD5以可靠的方式存储密码。 http://www.win.tue.nl/hashclash/rogue-ca/ – 2011-03-29 05:17:21

+0

你不应该在客户端进行salting/hashing。盐应该保密。如果您不想传输密码以供服务器执行salt + hash,请考虑启用SSL,或使用公钥密码术对其进行披露。无论哪种方式,盐都不应暴露。无论哪种情况,依靠Javascript来做这件事情都不是特别可靠。 – 2011-03-29 05:17:25

回答

3

第一关:不要使用MD5:这还不够强大。

@Shaggy Frog的好建议,使用bycrypt。这些帖子应该帮助你:

https://stackoverflow.com/questions/2299434/bcrypt-implementation-in-javascript

Do I need to store the salt with bcrypt?

JS implementation of Bcrypt on Google Code


见日bCrypt JavaDoc

,你会怎么做,是在服务器上,当有人保存密码:

BCrypt.hashpw(plain_password, salt); 

当有人试图登录:

if(BCrypt.checkpw(password_typed_by_user, stored_hash) 
{ 
    //itmatches.. log him/her in. 
} 

你可以做的是使用的用户名(或者一个用户名中的几个字母)用于盐,所以您不必将其存储在某个地方。

当您需要再次采取明文密码(在服务器上),然后重新散列它就像当你最初保存它,你会做密码更改。如果你正在考虑检索,那就没有办法,那就是哈希的问题。像大多数网站一样,您可以将密码更改为一些随机数字,然后将其通过电子邮件发送至所请求的地址。

+0

感谢您的帮助,我在服务器上使用了Java Struts 1.1。基本上我试图编码在网络上传输的密码。但我无法理解你的解决方案来检查javascript中的用户密码,我怎么知道哪个用户正在尝试登录。 – Sunny 2011-03-29 07:29:08

+1

我不明白为什么你甚至需要javascript。我指出的第二个问题是使用Java bCrypt库。它应该适合你。你为什么试图在客户端上验证用户,当用户登录时会联系你的服务器,用**服务器上的bCrypt对用户密码进行哈希处理,然后检查它是否与用户名相关的数据库记录匹配。 – gideon 2011-03-29 07:32:51

+0

@sunny更新了答案。 – gideon 2011-03-29 07:35:21

2

客户端加密是无用的,因为您最终无法控制结果。只有服务器端加密才有效。

将密码存储为MD5散列并不是最佳实践。这就是网站容易被黑客攻击的方式。盐不会帮助你。

Use bcrypt

+0

+1完全忘了bcrypt! – gideon 2011-03-29 05:39:26