openssl_encrypt에서 초기화 벡터 사용
Author : 치치     Date :  2019-12-05 15:36:41   Views : 5회  

나는 this 질문을 보았고, 나 자신을 위해 그것을하고 싶었다. 이 코드를 실행했을 때 (this answer에서 바로 가져옴) :

 

 

$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

그래서 저는 docs를 보았습니다. 그러나 거기에 ‘문서가 없습니다’. 나는이 comment을 발견했으나 초기화 벡터가 무엇인지, 그리고 어떻게 사용해야하는지에 대해서는 언급하지 않았다. 아무도 나에게 계몽 수 있습니까?

나는 더 많은 Googleing을 할 수 있음을 알고 있지만 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 암호화 구현을 도와 줄 수 있습니다.

 

 





❌Delete 🛠Modify 🐣Reply 📄List
No Subject
Author Date Like Views