【问题标题】:salt and hash generation question盐和哈希生成问题
【发布时间】:2010-03-03 22:52:10
【问题描述】:

我只是想听听您对某事的反馈。

基本上我有一个名为 $uniqueID 的值,即 = ID + 名字的第一个字母 + 姓氏的第一个字母 + 字符串“CAN”

然后我将 $uniqueID 转换为盐值,如下所示 $salt = sha1($uniqueID);

然后我使用 md5() 将用户密码转换为哈希值。

然后,我使用正确的数据类型将这两个值单独存储在数据库中。

我只是想知道这是否是一种保护两种类型用户验证的安全方法?密码验证将由用户完成,$uniqueID 将通过脚本完成。

我不会提供提醒您密码的服务,您必须创建一个全新的密码。

我还为会议实施了一些安全措施。

【问题讨论】:

  • 不应将盐用作 ID,反之亦然。
  • 我是否应该将 ID 更改为注册日期?

标签: php security hash salt


【解决方案1】:

一般来说,盐是一个随机值,对于它所使用的每个数据都是唯一的。这意味着每个用户都应该有自己的随机且唯一的盐,用于散列其密码。并且不要使用任何用户信息来生成盐。

例如,您可以使用 randuniqid 为每个用户生成随机且唯一的盐:

$salt = uniqid(rand(), true);

这种盐既独特又随机。

【讨论】:

  • 不,只是具有弱熵的伪随机。
【解决方案2】:

我建议在 $uniqueID 和密码字段上都使用 sha1

另外,请确保您的密码字段加盐。

此外,值得注意的是,哈希可以从不同的输入中得出相同的值的一种方式。正如 Gumbo 指出的那样,如果您打算使用 $uniqueID 作为唯一 ID,您会遇到问题。 (所以不要;-)

如果您想使用uniqueID 作为会话密钥,那么您至少需要在使用它之前检查是否存在冲突。见Zend.SessionCodeIgniter->sessionKohona::Session

【讨论】:

  • 我如何给密码字段加盐?
  • 与对ID 字段加盐的方式相同...加盐是在输入字符串散列之前添加到输入字符串的附加输入。 (它可以是固定的、生成的或两者兼而有之)。所以你可以使用sha1("myS4lt" . $password . "in3cr4ckEr!") 我只使用一个固定的盐,因为如果你允许用户更改他们的名字并且你用用户首字母加盐密码,你将使密码无效。
  • 那我是不是最好只使用 sha1 作为密码并将 $uniqueID 保留为普通字符串?我考虑在会话中增加安全性以验证用户是否是真实用户?
  • 这取决于你想用$uniqueID 做什么。如果您打算将其用作会话密钥,那么您可能仍想对其进行散列 - 只需仔细检查并确保您没有冲突。我会检查一些成熟的会话引擎;例如 Zend.Session 和 CodeIgniter 以及 Kohona 的会话。我会在我的答案中添加链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多