【问题标题】:PHP: Options to generate an unique user keyPHP:生成唯一用户密钥的选项
【发布时间】:2011-01-26 19:03:34
【问题描述】:

经过几天对散列、生成随机数或唯一键的研究,我现在有点困惑。

我还有最后一件事想要做对,那就是用户密钥。我想为在我的网站上注册的每个成员/用户存储一个唯一的密钥。所以这个键必须是唯一的,不能重复。我正在考虑使用用户电子邮件并将其与时间日期或其他内容进行哈希处理......

那我想知道创建这样一个密钥的最佳方法是什么-

我可以使用hash_hmac() 为我执行此操作吗?

我对@9​​87654322@ 有一些不明白的地方 - 就像来自 php.net hash_hmac('ripemd160', 'The quick brown fox jumped over the lazy dog.', 'secret'); 的这个例子一样

那么什么是“秘密”——我可以用不同的东西代替吗,比如时间日期? 我假设我可以替换“快速棕色狐狸跳过懒狗”。电子邮件地址?

或者我可以使用Portable PHP password hashing framework 来执行此操作?

唯一的问题是它会生成.$/,我需要将它们删除,否则当我从 URL 请求密钥时会出错。

所以我可以这样做 -

$hash = $phpass -> HashPassword('me@example.com'.$timedate)
$key = preg_replace("/[^a-zA-Z0-9]+/", "", $hash);

如果您有更好的建议,请告诉我。

【问题讨论】:

  • 一个简单的 md5() 函数是否不足以满足您的目的?还是字符串也需要可解码? md5(),当使用一个用户 ID(它本身应该是唯一的,因为你使用的是数据库),假设电子邮件地址将提供一个固定长度为 32 个字符的字符串,你可以使用并且几乎第三方无法解码
  • 你需要这个唯一的用户密钥做什么?
  • @Gumbo♦:当用户验证他们的电子邮件地址等时,我使用它来进行身份验证。例如,当有人注册时我会发送一封电子邮件并要求他/她点击一个验证链接,例如 - xx.com/verify/(key) - 有意义吗?

标签: php hash key


【解决方案1】:

我还有最后一件事想要做 正确的是用户密钥。一世 想为每个人存储一个唯一的密钥 在我注册的会员/用户 网站。所以这个键必须是唯一的 并且不重复。我想 使用用户电子邮件并将其与 时间日期什么的

  • 我会让您的数据库使用autoincrement 为您处理这个问题
  • 您也可以为此使用uniqidmd5(uniqid(rand(), TRUE));

index.php:

for ($i=0;$i<10;$i++) {
    echo md5(uniqid(rand(), TRUE)) . "\n";
}

输出:

php index.php 
ba0d9aad1ff0ceadf4b25f101099b91e
b5a6db5e174b426061d3d3835a6fcaea
54be6d3a03e0590917ed20b097442e3a
6e208a61eae8cfd102d4a41decf0f64e
2cafac5402815af87e8299e5e67016bd
95e839097a566471c70fe357e5a101d2
c6908532bda6f926debdda754b02f931
aac7adf999dd4dd009f208b176ea90d0
1ed7779229e57b05adc088b375582cfb
e016a684564d5cdb89201ebab1038609

它们都是独一无二的,您可以直接使用它们。你不应该做任何其他事情吗?

【讨论】:

  • @Alfred:谢谢。我可以将电子邮件地址添加到 md5 中以使用它像 - md5(uniqid(rand(), TRUE).$email); 一样散列吗?
  • 你可以,但你为什么要首先这样做?
  • @Alfred:以防万一 md5(uniqid(rand(), TRUE));本身不足以创建唯一键!因此,添加电子邮件将使其 100% 独一无二!大声笑还是没有必要?
  • 自动增量,说真的。为什么要用别的东西?有电子邮件,人们不能更改他们的电子邮件,或者不能共享电子邮件(一些已婚夫妇实际上这样做)
  • @Alfred:非常感谢 - 我会非常喜欢这个 openid!谢谢!! :-)
【解决方案2】:

我建议“窃取”drupal_random_bytes 函数。

【讨论】:

    【解决方案3】:

    关于 hash_hmac(): 我相信“秘密”只是一些只有你和代码知道的字符串。它用于帮助随机化算法并根据您使用的“秘密”密钥使其唯一。只需选择您知道的任何短语,然后将其放在那里。 注意:如果您期望返回相同的值,则每次散列时都必须是相同的值。所以让它成为一个常数,而不是变量,以免你的散列在你使用它时返回一个不同的值每次

    但是,是的,用你想要散列的任何东西替换“quick brown fox”,它应该可以工作。

    还有一个选项:使用数据库中用户的主键[通常是一个简单的整数]来引用它们。

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2023-04-04
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2016-05-20
      • 2013-07-18
      • 2012-04-09
      • 2015-03-06
      相关资源
      最近更新 更多