我想更新当前仅使用 MD5 的密码设置。
现在我想做的是使用更强大的东西(也许是 sha256),每个用户都有独特的盐。
问题是关于盐的储存。
我是否将盐存储在数据库中自己的列中?
然后哈希盐+密码,当涉及到登录时,从数据库中调用盐和密码,使其成为一个。
还是我通过使用用户名、电子邮件和时间戳来制作盐的方式,这也将为每个用户提供一个独特的盐?
我想知道,如果有人持有以盐为列的数据库,他们会知道每个用户的盐,然后他们就可以破解密码。
我想更新当前仅使用 MD5 的密码设置。
现在我想做的是使用更强大的东西(也许是 sha256),每个用户都有独特的盐。
问题是关于盐的储存。
我是否将盐存储在数据库中自己的列中?
然后哈希盐+密码,当涉及到登录时,从数据库中调用盐和密码,使其成为一个。
还是我通过使用用户名、电子邮件和时间戳来制作盐的方式,这也将为每个用户提供一个独特的盐?
我想知道,如果有人持有以盐为列的数据库,他们会知道每个用户的盐,然后他们就可以破解密码。
盐不是秘密,它可以与哈希一起存储明文。甚至不需要在数据库中有第二个字段。如果您查看 PHP 的crypt()
函数,您可以看到,盐值将包含在哈希值本身中。
这是盐的工作,使已经存在的彩虹表无用,因为必须为一种特定的盐构建彩虹表。为每个散列使用不同的盐将防止彩虹表攻击,因为您必须为每个散列创建一个彩虹表。这就是为什么不需要对盐保密的原因。
我建议,如果你想改进你的密码哈希系统,你做对了,使用慢的哈希函数。使用 bcrypt 的密码散列一文解释了为密码生成散列的要点。
最后但同样重要的是,不要害怕正确地执行它,您的应用程序的代码可以像您当前使用 MD5 实现一样简单。
忘记 MD5 或 SHA。使用 Bcrypt。(Blow Fish Crypt) 自带 PHP 5.3 及更高版本。(加密方法 2a)它更安全且处理速度更慢。
使用 Bcrypt 时,盐与哈希一起存储在同一个 feild 中。没有理由分开一个。
刚刚阅读另一篇文章,有人说盐不是秘密,可以存储在数据库列中。所以这回答了我的问题