为了存储会话而生成哈希的最佳方法是什么?我正在寻找一种轻便,便携的解决方案。
答案 0 :(得分:65)
bin2hex(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM));
示例输出:
d2c63a605ae27c13e43e26fe2c97a36c4556846dd3ef
请记住"最好"是一个相对的术语。您需要在安全性,唯一性和速度之间进行权衡。上面的示例适用于99%的情况,但如果您处理的是特别敏感的数据,您可能需要阅读difference between MCRYPT_DEV_URANDOM and MCRYPT_DEV_RANDOM。
最后,有一个RandomLib"用于生成随机数和各种强度的字符串"。
请注意,到目前为止,我假设您正在寻找生成随机字符串,这与从值中派生哈希不同。对于后者,请参阅password_hash。
答案 1 :(得分:17)
random_bytes()
自PHP 7.0开始提供(或使用this polyfill for 5.2 through 5.6):
$hash = bin2hex(random_bytes(16));
echo serialize($hash);
输出:
S:32:" c8b2ca837488ff779753f374545b603c&#34 ;;
答案 2 :(得分:10)
您可以使用PHP的内置散列函数sha1
和md5
。选择一个,而不是两个。
有人可能认为同时使用sha1(md5($pass))
是一种解决方案。使用它们不会使您的密码更安全,它会导致冗余数据并且没有多大意义。
看一看PHP Security Consortium: Password Hashing他们发表了一篇有关弱点的好文章,并通过散列提高了安全性。
Nonce代表“ n 使用一次”的会员。它们用于防止未经授权访问的请求,它们发送机密密钥并在每次使用代码时检查密钥。
查看更多信息答案 3 :(得分:9)
也许你需要uniqid()?
答案 4 :(得分:7)
您可以使用openssl_random_pseudo_bytes自php 5.3.0生成伪随机字节串。您可以使用此函数并使用以下方法之一以某种方式将其转换为字符串:
$bytes = openssl_random_pseudo_bytes(32);
$hash = base64_encode($bytes);
或
$bytes = openssl_random_pseudo_bytes(32);
$hash = bin2hex($bytes);
第一个将生成最短的字符串,包括数字,小写,大写和一些特殊字符(=,+,/)。第二种方法是生成十六进制数字(0-9,a-f)
答案 5 :(得分:1)
如果可用,请使用random_bytes()
!
$length = 32;
if (function_exists("random_bytes")) {
$bytes = random_bytes(ceil($lenght / 2));
$token = substr(bin2hex($bytes), 0, $lenght)
}
答案 6 :(得分:0)
我个人使用apache的mod_unique_id生成随机唯一编号来存储我的会话。它非常容易使用(如果你使用apache)。
对于nonce来看看http://en.wikipedia.org/wiki/Cryptographic_nonce,甚至还有一个指向PHP库的链接。
答案 7 :(得分:0)
我通常不会手动管理会话ID。我已经看到这些线路的东西推荐用于混合之前的东西,我从来没有使用过自己所以我不能证明它比默认更好或更差(注意这是与autogen一起使用而不是手动管理)。
//md5 "emulation" using sha1
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 5);
答案 8 :(得分:-3)
不同的人会有不同的best
方式。但这是我的方式:
rand-hash.php
文件:
http://bit.ly/random-string-generator include()
它在你正在使用的php脚本中。然后,简单地打电话
cc_rand()
功能。默认情况下,它将返回6个字符长
随机字符串,可能包含a-z, A-Z,
和0-9
。你可以通过
length
指定应返回的字符数cc_rand()
。示例:
cc_rand()
会返回类似:4M8iro
cc_rand(15)
会返回与此类似的内容:S4cDK0L34hRIqAS
干杯!