2011-02-17 102 views
6

我有两种盐,每个用户都有一个独特的盐,与用户信息一起存储在数据库中。第二种盐是特定于网站的盐。两者都需要散列密码。哪里是最好的地方存储网站的密码salt?

问题是我不知道我应该在哪里保持我的网站盐。现在它驻留在运行散列算法的PHP方法中。我应该将它保存在/ var/www /之外的文件中并让PHP打开并阅读文件?我不想将它存储在数据库中,因为如果我的数据库受到损害,那么这会破坏使用两种盐的目的。

有什么建议吗?

+0

作为config.php文件中的常量? – Jonah 2011-02-17 17:30:20

回答

11

还没提到一个选项吗?服务器提供的环境变量。你可以在httpd.conf或.htaccess中完成。因为Apache不服务.htaccess文件,你并不需要担心它隐藏尽可能多...

SetEnv WEBSITE_SALT 232lhsdfjaweufha32i4fv4239tauvkjn 

这样的话,你需要在你的应用程序做的是$salt = getenv('WEBSITE_SALT');。这样做的好处是,它是透明的应用程序...

+1

为什么不是每个人都喜欢你?这很棒! – Undo 2013-04-03 13:42:34

+0

我可以在这里看到一个问题。在大多数应用程序中,用户具有相同的密码,如“密码”或“密码”。如果使用相同的salt生成具有相同值的MD5哈希值,则会生成相同的哈希值,从而允许潜在的攻击者检测模式并在应用程序中创建用户密码。 我试图对相同的盐与Python的hashlib:(下文中提取) `明文= '你好世界' 盐= '232lhsdfjaweufha32i4fv4239tauvkjn' H1 = hashlib.md5(盐+明文).hexdigest() H2 = hashlib.md5 (salt +明文).hexdigest() print h1 == h2 >> True` – 2016-06-02 03:27:44

5

是,保持它在某处的PHP配置文件,最好是Web根目录上面的文件夹。

0

将网站salt存储在永远无法提供的文件中是您最好的选择。如你所指出的那样,加密盐或与其他人保持联系毫无意义。只要确保存储它的文件在请求时不能被提供(在根www之外工作)并确保它具有适当的权限设置。

0

只需将其粘贴到.php文件中的变量中即可。为了增加安全性,通过-默默无闻的一个小一点,你可以将其存储在(比方说)base64编码格式,并将该变量命名的东西完全无害的,像

$this_is_not_the_salt_you_are_looking_for = base64_decode(.... encoded salt string here ...); 

出于安全的一个额外的附加位,将.php文件放置在webroot之外的某个位置,以便如果由于某种原因Web服务器的配置变得糟糕,并开始提供原始PHP代码,则包含盐信息的文件不能直接访问。

-3

大多数人会存储常数盐在配置文件中。这很好,但使用SALT的重点是确保您的数据无法被外部源读取。

我见过很多人实际上将salt存储在数据库的accounts字段中。尽管如此。它是创建帐户时唯一生成的,因此每个用户都有独特的盐。

这不是盐,但 - 这是关于你如何对数据进行加密。

sha1($password.md5(md5($password.md5($salt)))) 

即使使用盐,您也可能永远无法破解它。因此,如果您决定每个帐户都独一无二,那么请不要担心将其存储在数据库中。只要确保你的加密过程是强大的!