Programing

openssl_encrypt에서 초기화 벡터 사용

lottogame 2020. 11. 5. 07:36
반응형

openssl_encrypt에서 초기화 벡터 사용


나는 질문을 보고 스스로하고 싶었다. 이 코드를 실행했을 때 ( 이 답변 에서 직접 가져옴 ) :

$textToEncrypt = "My super secret information.";
$encryptionMethod = "AES-256-CBC";  // AES is used by the U.S. gov't to encrypt top secret documents.
$secretHash = "25c6c7ff35b9979b151f2136cd13b0ff";

//To encrypt
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, '1234567812345678');

//To Decrypt
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash);

//Result
echo "Encrypted: $encryptedMessage <br>Decrypted: $decryptedMessage";

그러나 나는 경고를 받는다.

openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended

그래서 나는 문서를 보았습니다 . 그러나 '문서가 없습니다'. 주석을 찾았 지만 초기화 벡터가 무엇인지, 어떻게 사용해야하는지에 대한 언급은 없습니다. 누구든지 나를 깨달을 수 있습니까?

더 많은 Google 작업을 수행 할 수 있었지만 Stackoverflow가 너무 많은 검색 결과에서 가장 먼저 나타나서이 질문이이 문제를 겪고있는 다른 사람에게 유용 할 것이라고 생각했습니다.


IV는 일반적으로 암호화 된 텍스트가 고유함을 보장하는 난수입니다.

필요한 이유를 설명하기 위해 '비밀'키로 암호화되고 IV가없는 사람들의 이름 데이터베이스가 있다고 가정 해 보겠습니다.

1 John dsfa9p8y098hasdf
2 Paul po43pokdfgpo3k4y
3 John dsfa9p8y098hasdf

John 1이 자신의 암호 텍스트 (dsfa9p8y098hasdf)를 알고 있고 다른 암호 텍스트에 액세스 할 수있는 경우 John이라는 다른 사람을 쉽게 찾을 수 있습니다.

이제 실제로 IV가 필요한 암호화 모드는 항상 하나를 사용합니다. IV를 지정하지 않으면 자동으로 일련의 null 바이트로 설정됩니다. 상수 IV (00000000)를 사용하는 첫 번째 예를 상상해보십시오.

1 John dsfa9p8y098hasdf 00000000
2 Paul po43pokdfgpo3k4y 00000000
3 John dsfa9p8y098hasdf 00000000

반복되는 암호 텍스트를 방지하기 위해 동일한 '비밀'키와 임의의 IV를 사용하여 이름을 암호화 할 수 있습니다.

1 John sdf875n90mh28458 45gh3546
2 Paul fg9087n5b60987nf 56897ngq
3 John gjhn0m89456vnler 8907345f

보시다시피 두 개의 'John'암호 텍스트가 이제 다릅니다. 각 IV는 고유하며 암호화 프로세스에 영향을 미쳐 최종 결과를 고유하게 만듭니다. John 1은 이제 사용자 3의 이름이 무엇인지 모릅니다.

암호를 해독하려면 텍스트가 암호화 된 것과 동일한 IV를 사용해야하므로 데이터베이스에 저장해야합니다. IV는 키 없이는 사용할 수 없으므로 암호화 된 텍스트로 전송하거나 저장하는 것은 문제가되지 않습니다.

이것은 지나치게 단순한 예이지만 사실은 IV를 사용하지 않으면 보안에 심각한 영향을 미칩니다.


이제 코드가 IV (1234567812345678)를 설정하는 것처럼 보이지만 암호 해독에는 사용하지 않습니다. 그것은 실패 할 것입니다.

PHP의 IV 생성 기능 중 일부를 활용할 수도 있습니다. 나는 이것이 당신에게 효과가 있다고 생각합니다.

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, 0, $iv);
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash, 0, $iv);

저장 / 전송을 위해 다음과 같이 IV와 암호 텍스트를 간단히 연결할 수 있습니다.

$data = $iv.$encryptedMessage;

그런 다음 검색 할 때 복호화를 위해 IV를 꺼냅니다.

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = substr($data, 0, $iv_size);
$decryptedMessage = openssl_decrypt(substr($data, $iv_size), $encryptionMethod, $secretHash, 0, $iv);

자세한 내용은 PHP의 Mcrypt 라이브러리를 확인하세요. 완전한 기능을 갖추고 있으며 수많은 예제가 있으며, 그중 많은 것들이 openssh 암호화 구현에 도움이 될 수 있습니다. http://php.net/manual/en/function.mcrypt-encrypt.php

참고 URL : https://stackoverflow.com/questions/11821195/use-of-initialization-vector-in-openssl-encrypt

반응형