2014-06-23 55 views
0
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); 
    } 

这将返回上刷新:PHP类函数的散列

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

如果你仔细在第几行它的变化不断。我不认为哈希会不断变化!所以在技术上我永远无法对此进行测试。有人可以帮助我用我的kryptonite地穴功能或向我解释真的出了什么问题。

+2

为什么不只是使用['password_hash()'](http://php.net/password_hash)?另外,'$ 6 $ ...'是一个无效的哈希字符串。 SHA512哈希字符串格式为$ 6 $ rounds = N $ hashstringhere $'。你应该[正确阅读文档](http://php.net/crypt)! –

+1

1.不要使用'array_rand'作为安全性。 2.使用密码散列API。 – sectus

+0

@ SverriM.Olsen我以为默认轮数为5000,所以你不必声明它,除非修改它。我无法使用password_hash,但我的PHP版本是5.2。*(000webhost)很抱歉地说。我有一些钱从GoDaddy购买主机,然后我将改变功能以支持新的PHP – EasyBB

回答

0

当您使用array_rand()函数时,您将得不到相同的哈希值。结果需要是确定性的。

sha1()是不是有足够的理由?

+0

这正是我的想法,我看了一个关于这个的视频来帮助我,这就是这个人所说的。有什么更好的解决方案先生? 'sha1()'可以通过暴力获得。 md5和sha1甚至声称不使用它在PHP文档 – EasyBB

+1

@EasyBB是一个有能力的软件开发人员或一些关闭YouTube的孩子的视频? – alex

+0

他似乎有能力HAHA拥有或拥有www.worldofwebcraft.com – EasyBB

1

您将无法使用array_rand()时,我建议这样的事情,如果你打算使用,需要一个双向加密

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; 
} 
+0

我不想加密或解密,这就是为什么我使用crypt作为单向字符串散列算法,虽然加1为openssl东西的人 – EasyBB

+1

@EasyBB,散列不能被解密。 – sectus

+0

那你为什么要将你的行为分类为加密和解密 – EasyBB

2

。如要得到相同的结果事实上,哈希应该随机更改 - 它被称为随机腌制。你的crypt函数产生一个随机的盐,它被送到SHA-512散列器。

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()等。

+0

我没有5.4+ :(另外我想说明的是,我正在教自己所有的这些,偶尔从SO帮助我。这个和我还没有开始这个课程,我通常跳到前面,所以我不必听教授:) – EasyBB

+0

你应该真的升级...但无论如何,5.4位只是访问数组成员的能力直接来自函数调用的结果。否则,你必须做'$ result = preg_match('...'); $ salt = $ result [1];' –