2017-05-02 79 views
1

我在研究Internet上的AES加密時發現了以下代碼。在此代碼中,我發現keyiv使用hash function生成,並使用sha256。我想知道這種方法是否對使用PHP加密文本是安全的。用於AES加密的生成密鑰的安全

,我在網上找到了下面給出的代碼,

<?php 
function encrypt_decrypt($action, $string) { 
    $output = false; 

    $encrypt_method = "AES-256-CBC"; 
    $secret_key = 'This is my secret key'; 
    $secret_iv = 'This is my secret iv'; 

    // hash 
    $key = hash('sha256', $secret_key); 

    // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning 
    $iv = substr(hash('sha256', $secret_iv), 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; 
} 

$plain_txt = "This is my plain text"; 
echo "Plain Text =" .$plain_txt. "\n"; 

$encrypted_txt = encrypt_decrypt('encrypt', $plain_txt); 
echo "Encrypted Text = " .$encrypted_txt. "\n"; 

$decrypted_txt = encrypt_decrypt('decrypt', $encrypted_txt); 
echo "Decrypted Text =" .$decrypted_txt. "\n"; 

if ($plain_txt === $decrypted_txt) echo "SUCCESS"; 
else echo "FAILED"; 

echo "\n"; 

?> 

回答

2

不,它不是從獲得密碼的加密密鑰的安全方法。

只使用散列函數是不夠的,只是添加鹽沒有提高安全性。相反,用隨機鹽迭代HMAC約100ms持續時間,然後用散列表保存鹽。使用諸如PBKDF2,Rfc2898DeriveBytes,Bcrypt或類似功能的功能。關鍵是要讓攻擊者花費大量時間通過強力查找密碼。

一般公認的方法是PBKDF2(密碼密鑰推導函數2),有時在某些實現中被稱爲Rfc2898DeriveBytes

注意:處理IV的一種普遍接受的方式是將加密的消息與IV一起用於解密。 IV不需要是保密的,對於使用相同密鑰的每次加密,它需要不同,這通常通過使用來自CSPRNG(密碼安全僞隨機數生成器)的隨機字節數組來實現。

+0

我對代碼做了一些更改。你能看看代碼並告訴我這是否會有所作爲?這裏是代碼的鏈接https://codeshare.io/5wydZB –

+0

第1號。使用CPRNG,而不是使用'array_rand'的自制實現,它聲明:「它使用僞隨機數生成器**不適用於加密目的。「 2.從文檔'crypt'不會迭代,並且需要足夠的迭代來需要100ms。這個IV似乎沒有通過解密。 4.海事組織你最好的選擇是使用[RNCryptor](https://github.com/RNCryptor/RNCryptor-php),它使事情正確,增加認證,版本控制並且經過審查。 – zaph

1

IV不是祕密,但應該是唯一的,使得使用相同密碼加密的兩個字符串具有不同的加密值。所以這是一個不好的方法來產生它。使用http://php.net/manual/kr/function.openssl-random-pseudo-bytes.php或類似的函數爲每次加密某些數據並將IV與數據一起存儲時生成一個唯一的IV。

@ zaph已經評論了密碼是如何從密碼派生的問題