source

openssl_encrypt에서의 초기화 벡터 사용

manysource 2022. 10. 14. 22:13

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

그래서 가서 서류를 봤는데, '서류가 없다'는 거예요. 코멘트는 찾았지만 초기화 벡터의 정의와 사용 방법에 대해서는 아직 언급하지 않았습니다.누가 나를 깨우쳐 줄 수 있나요?

구글링을 좀 더 할 수도 있었지만 Stackoverflow가 너무 많은 검색 결과에서 1위를 차지하기 때문에 이 문제가 있는 다른 사람에게도 도움이 될 수 있다고 생각했습니다.

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

왜 그것이 필요한지 설명하기 위해, IV가 없는 키 '비밀'로 암호화된 사람들의 이름 데이터베이스를 가지고 있다고 가정해 봅시다.

1 John dsfa9p8y098hasdf
2 Paul po43pokdfgpo3k4y
3 John dsfa9p8y098hasdf

John 1이 자신의 암호문(dsfa9p8y098hasdf)을 알고 다른 암호문에도 접근할 수 있다면 John이라는 이름을 가진 다른 사람을 쉽게 찾을 수 있습니다.

실제로 IV가 필요한 암호화 모드에서는 IV가 항상 사용됩니다.IV를 지정하지 않으면 자동으로 null 바이트 다발로 설정됩니다.첫 번째 예에서는 상수 IV(00000000)를 사용한다고 가정합니다.

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

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

1 John sdf875n90mh28458 86714561
2 Paul fg9087n5b60987nf 13541814
3 John gjhn0m89456vnler 44189122

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

복호화에는 텍스트가 암호화된 것과 동일한 IV를 사용해야 합니다.그러므로 암호화된 데이터 옆에 저장해야 합니다.복호화에서는 키가 없으면 IV는 무용지물입니다.따라서 IV를 암호화 텍스트와 함께 전송하거나 저장하는 것은 중요하지 않습니다.

이것은 지나치게 단순한 예이지만, 사실은 IV를 사용하지 않으면 심각한 보안 문제가 발생하기 때문에 IV가 처음부터 존재하는 것입니다.IV를 사용하지 않는 수많은 암호화 구현이 악용되고 있음은 의심의 여지가 없습니다.

①보안 지식이 향상됨에 따라 IV를 사용하여 키를 획득할 수 있는 다양한 블록 암호 모드 및 연결 기술(특히 아래에 기술된 연결 방법론과는 관련이 없음)에 대한 보다 복잡한 악용 사례가 있다는 것을 알게 되었습니다.WEP나 WPA 등의 오래된 테크놀로지의 키를 판별하고 Wi-Fi 트래픽을 복호화하기 위해 RC4 데이터 스트림을 이용하는 예를 다음에 나타냅니다.


이 시점에서 코드에서는 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);

예를 들어 IV를 데이터베이스에 저장하는 경우 IV를 인접한 열에 저장하여 추출 프로세스를 단순화할 수도 있습니다.


자세한 내용은 PHP의 Mcrypt 라이브러리를 참조하십시오.풀기능이 풍부하고 예도 풍부하며, 그 중 많은 부분이 opensh 암호화 구현에 도움이 됩니다.http://php.net/manual/en/function.mcrypt-encrypt.php


보안 면책사항:내 말은 가장 간단한 개념을 가장 간단한 방법으로 묘사한다.내가 아는 한, 그리고 깊이 있는 한, 나는 완전히 초보자이다.최고의 보안 연구자 및 전문가도 항상 암호화 취약성을 도입합니다.그렇다고 해도, 스스로 쓰는 것이 적을수록, 유저, 고객, 가족, 친구의 형편이 좋아집니다.악의는 없어요!암호화 이론을 배우는 것은 재미있고 흥미롭고 실용적이지만, 특히 PHP와 같이 접근하기 쉬운 분야의 컴퓨터 과학에 적용되어 베스트 프랙티스를 최신 상태로 유지하고 신뢰할 수 있는 최신 라이브러리를 사용하는 것은 99.999999%에게 가장 안전한 시스템을 제공할 것입니다.완벽한 것은 없지만, 거인의 어깨에 서는 것이 가장 좋다.현명한 사람이라면 아마도 이렇게 말했을 것이다. " 많이 배울수록 더 많이 알게 된다."

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