我想创建一个16字符长的完全唯一的哈希,以便为某些私人博客帖子建立公共链接。所以可以通过以下方式访问它们:
在Laravel中有一个帮助函数
\Hash::make($request->password);
它产生这样的哈希:
$2y$10$kouytAixb/Yp5gpH7QqL6et/P.fW.qElsGkMncVM.1/29waEqeqjy
麻烦的是我想制作一个只使用字母和数字的哈希值,长度为16个字符,绝对是唯一的。
答案 0 :(得分:1)
如果它不需要保证安全(即,如果有人可以将其反转以获得原始值,则不在乎),只需md5()
它。这将返回一个16字符的十六进制字符串,该字符串分布合理。
md5($model->id);
答案 1 :(得分:1)
John Elmore的回答是正确的,另外,Hashing一个数字使得这个值容易受到彩虹表攻击,所以我会添加一些" salt"在实际的id之前,很难猜到,所以彩虹表是无用的,理想情况下,长度为20或更长:
md5(salt . $model->id)
HTH
答案 2 :(得分:1)
这是两个选项。不完全是16个字符。
hash
函数生成随机数。
echo hash('ripemd128', 'some random input');
// echo's hex represented 32byte of data
id
。使用对称加密,key
将解锁该数据。独特性不再重要,怎么可能不是...... 在php doc中解释,http://php.net/manual/en/function.openssl-encrypt.php
//$key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
//store $cipher, $iv, and $tag for decryption later
$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
echo $original_plaintext."\n";
}
您可以使用此方法http://php.net/manual/en/function.openssl-get-cipher-methods.php
查找密码列表