2014-06-23 94 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];' –