2017-05-02 80 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已经评论了密码是如何从密码派生的问题