2017-12-29 7 views
3

프로젝트에서 암호를 사용하고 있으며 openssl_encryptopenssl_decrypt으로 작업하는 방법에 대한 약간의 도움이 필요합니다. 가장 기본적인 방법을 알고 싶습니다. 여기에 지금까지 무엇을 가지고 있습니다 : 다음 사용 $cypherMethod, $key$iv$encryptedData를 해독 할 때 저장올바른 방법은 PHP openssl_encrypt를 사용하는 것입니다.

// To encrypt a string 

$dataToEncrypt = 'Hello World'; 

$cypherMethod = 'AES-256-CBC'; 
$key = random_bytes(32); 
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cypherMethod)); 

$encryptedData = openssl_encrypt($dataToEncrypt, $cypherMethod, $key, $options=0, $iv); 

. (의 내가 값을 저장하는 방법을 자세히 설명하지 감사하자!)

// To decrypt an encrypted string 

$decryptedData = openssl_decrypt($encryptedData, $cypherMethod, $key, $options=0, $iv); 

우선, 위의 예제 코드는 php openssl_encrypt을 사용하는 방법에 대한 올바른 예입니다?

두 번째로 정확하고 안전한 $key$iv을 생성하는 내 방법은 무엇입니까? 계속 읽으므로 키는 암호로 보호되어야합니다.

마지막으로 AES-256-CBC에는 32-byte 값이 필요하지 않습니까? 그렇다면, 왜 openssl_cipher_iv_length()은 길이가 int(16)입니까? int(32)이 아니어야합니까?

답변

1

먼저 위의 예제 코드는 PHP openssl_encrypt를 사용하는 올바른 예입니다?

이 기능의 사용법은 정확하지만 CBC 이외의 작동 모드를 고려할 수 있습니다. 이 모드에서 데이터를 암호화하는 것만으로도 악의적 인 공격 (예 : CBC bit-flipping attack)이 알려져 공격자가 암호문을 수정하여 일반 텍스트에 의미있는 변경을 가할 수 있기 때문에 CBC는 까다로워집니다. 가능한 경우 GCM과 같은 인증 된 암호화 모드를 사용합니다 (보이는 경우는 it's supported in PHP 7.1+ (Example #1)).

CBC 모드를 사용하는 경우 Example #2 in the docs을 살펴보십시오. 암호화 후에는 MAC (메시지 인증 코드)이 암호문을 통해 계산되어 저장된다는 점에 유의하십시오. 이 MAC은 암호문을 해독하기 전에 다시 계산되어야하며, 저장된 MAC과 일치하지 않으면 암호문이 수정되어 유효하지 않습니다.

둘째, $ 키를 생성하고 $ iv 정확하고 안전한 방법입니다. 계속 읽으므로 키는 암호로 보호되어야합니다.

암호로 안전한 난수 생성 프로그램을 사용하여 키를 생성해야합니다. 다행히 대부분의 운영 체제는 /dev/urandom을 통해 즉시 제공합니다. This answer은 PHP에서 /dev/urandom을 읽는 방법을 잘 설명합니다. openssl_random_pseudo_bytes도 암호로 보호되어야하지만 times when this is not the case이 있어야합니다.

초기화 벡터 (IV)는 무작위 여야하며 같은 키로 절대로 재사용해서는 안됩니다.

마지막으로 AES-256-CBC에는 32 바이트 값이 필요하지 않습니까? 그렇다면 openssl_cipher_iv_length()가 길이로 int (16) 만 반환하는 이유는 무엇입니까? 그것은 int가 아니어야합니까 (32)?

AES는 키 크기에 관계없이 128 비트 (16 바이트) 블록에서 작동하는 블록 암호입니다.

+0

유익한 정보를 제공해 주셔서 감사합니다. 간단한 질문입니다. 하나의 일반 용도 키를 사용해야합니까? 아니면 매번 무작위로 생성해야합니까? –

+0

같은 열쇠를 사용할 수 있습니다. 단지'openssl_encrypt'를 호출 할 때마다 새로운 난수 IV를 생성해야합니다. – puzzlepalace

관련 문제