Laravel制作独特的16个字符哈希

时间:2017-11-10 19:01:25

标签: php laravel hash

我想创建一个16字符长的完全唯一的哈希,以便为某些私人博客帖子建立公共链接。所以可以通过以下方式访问它们:

  

https://website.com/read/ASDFGHJ9827DYCO9

在Laravel中有一个帮助函数

\Hash::make($request->password);

它产生这样的哈希:

$2y$10$kouytAixb/Yp5gpH7QqL6et/P.fW.qElsGkMncVM.1/29waEqeqjy

麻烦的是我想制作一个只使用字母和数字的哈希值,长度为16个字符,绝对是唯一的。

3 个答案:

答案 0 :(得分:1)

如果它不需要保证安全(即,如果有人可以将其反转以获得原始值,则不在乎),只需md5()它。这将返回一个16字符的十六进制字符串,该字符串分布合理。

md5($model->id);

答案 1 :(得分:1)

John Elmore的回答是正确的,另外,Hashing一个数字使得这个值容易受到彩虹表攻击,所以我会添加一些" salt"在实际的id之前,很难猜到,所以彩虹表是无用的,理想情况下,长度为20或更长:

md5(salt . $model->id)

HTH

答案 2 :(得分:1)

这是两个选项。不完全是16个字符。

  1. 使用php hash函数生成随机数。 echo hash('ripemd128', 'some random input'); // echo's hex represented 32byte of data
  2. 加密某些内容,例如页面的id。使用对称加密,key将解锁该数据。独特性不再重要,怎么可能不是......
  3. 在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

    查找密码列表