用于散列的PHP类函数

时间:2014-06-23 02:13:03

标签: php salt crypt

public function kryptonite($string){
   $salt = "";
   $salt_vars = array_merge(range("A","Z"),range("a","z"),range(0,9));
   for($i=0;$i < 22;$i++){
        $salt.= $salt_vars[array_rand($salt_vars)];
   }
   return crypt($string, '$6$'.$salt);
  }

这将在刷新时返回:

$6$vnuqcEA70$CHWmPVsDVb.lVpq1PNsDn7.0fSmBX6FU2PlofK6dJOH7FQp6EdSsde3Aw6to8fY1L01/WOcWz8OIE0OxK1LTj.
$6$7lmp9sD4g$I0fAcDjno2Lf255gg6TxTLt9TRwR803ZXiU9BOWJXhWrGbJdPJ3LvAW9w2KbRZ/3EDSSbFrgF7rV7DdB0VliA0

如果你仔细观察前几行,它会不断变化。我不认为Hashing会不断变化!所以从技术上讲,我永远无法对此进行测试。有人可以帮助我使用我的kryptonite隐藏函数,或者向我解释出现了什么问题。

3 个答案:

答案 0 :(得分:2)

事实上,哈希 应该随机改变 - 它被称为随机腌制。你的crypt函数正在创建一个随机盐,它被送到SHA-512 hasher。

crypt()的输出包含salt值,您可以在对密码进行散列时将其与存储的哈希值进行比较。

public function kryptonite($string, $salt = null){
    if ($salt === null) {
        $salt = "";
        $salt_vars = array_merge(range("A","Z"),range("a","z"),range(0,9));
        for($i=0;$i < 22;$i++){
            $salt.= $salt_vars[array_rand($salt_vars)];
        }
        $salt = '$6$' . $salt;
    }
    return crypt($string, $salt);
}

要使用此功能,您只需执行以下操作:

$storedHash = '.....'; // fetched from database
$inputPassword = '.....'; // from the user

$salt = preg_match('/\$[0-9]\$(.+)\$/')[1]; // php 5.4+

if (kryptonite($inputPassword, $salt) == $storedHash) {
    //.... success
}

请注意,创建随机盐的array_random实现不具有加密安全性 - 最好使用openssl_random_pseudo_bytes()mt_rand()等。

答案 1 :(得分:1)

使用array_rand()时,您将无法获得相同的结果如果您打算使用 salt 并需要双向加密,我建议您使用此类似的结果< / p>

function parse($action, $string) {
    $output = false;
    $encrypt_method = "AES-256-CBC";

    // hash
    $key = hash('sha256', "random encryption key that must stay the same");

    // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
    $iv = substr(hash('sha256', "ARANDOMIV"), 0, 16);

    if($action == 'encrypt') {
        $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
        $output = base64_encode($output);
    } else if( $action == 'decrypt' ){
        $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
    }
    return $output;
}

答案 2 :(得分:0)

当您使用array_rand()功能时,您将无法获得相同的哈希。结果必须是确定性的。

sha1()还不够好吗?