2017-05-02 8 views
1

인터넷에서 AES 암호화에 대해 연구하는 동안 다음 코드를 발견했습니다. 이 코드에서 keyivhash 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 또는 이와 유사한 기능을 사용하십시오. 요점은 공격자가 무차별 적으로 암호를 찾는 데 많은 시간을 소비하게하는 것입니다.

일반적으로 허용되는 방법은 일부 구현에서는 Rfc2898DeriveBytes이라고도 불리는 PBKDF2 (암호 키 유도 함수 2)입니다.

참고 : IV를 처리하는 일반적으로 인정되는 방법 중 하나는 해독에 사용할 IV로 암호화 된 메시지의 접두사를 붙이는 것입니다. IV는 비밀 일 필요는 없으며, 동일한 키를 가진 각각의 암호화에 대해 다를 필요가있다. 이것은 일반적으로 CSPRNG (Cryptographically Secure PseudoRandom Number Generator)의 랜덤 바이트 배열을 사용하여 달성된다.

+0

코드를 약간 변경했습니다. 코드를 살펴보고 이것이 어떤 차이를 만들지 말해 줄 수 있습니까? 다음은 코드 https://codeshare.io/5wydZB –

+0

No. 1에 대한 링크입니다. 'array_rand'를 사용하는 집에서 구현 한 CPRNG가 아닌 "CPRNG를 사용하십시오."라는 의사 랜덤 번호 생성기를 사용합니다 ** 암호화 목적으로 적합하지 않습니다. " 2. 문서에서 'crypt'는 반복하지 않으며 100ms를 요구하는 반복이 필요합니다. 3. IV가 암호 해독을 위해 전달되지 않은 것처럼 보입니다. 4. IMO가 가장 좋은 옵션은 [RNCryptor] (https://github.com/RNCryptor/RNCryptor-php)를 사용하는 것입니다. 바로 인증을 얻고, 버전을 지정하며 잘 검사됩니다. – zaph

1

IV는 비밀이 아니지만 동일한 암호로 암호화 된 두 개의 문자열을 다른 암호화 된 값으로 만들려면 고유해야합니다. 그래서 이것은 그것을 생성하는 나쁜 방법입니다. http://php.net/manual/kr/function.openssl-random-pseudo-bytes.php 또는 유사한 기능을 사용하여 일부 데이터를 암호화 할 때마다 고유 한 IV를 생성하고 데이터와 함께 IV를 저장하십시오.

@zaph는 이미 키가 암호에서 파생 된 방식에 대한 문제에 대해 댓글을 달았습니다.