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
隐藏函数,或者向我解释出现了什么问题。
答案 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()
还不够好吗?