2017-10-19 28 views
2

내 서버에 UUID를 만들려고하고 있는데 어떤 이유로 openssl_enrypt이 빈 문자열을 초기화하고 있습니다. 거짓으로 돌아가는 경우 다른 대화가되지만 그렇지 않은 경우 문자열을 반환하고 비어있는 문자는 반환합니다. 내가 var_dumped$key, $iv$dataEncrypt을 가지고 있고 그들은 모두 올바른 값을 반환openssl_encrypt가 빈 문자열을 반환 함

$key = hash_hmac("sha512", "You can decrypt this all day long, won't get you closer to the truth", "myKey"); 
$iv = openssl_random_pseudo_bytes(16); 
$adminVal = filter_var($userData['is_admin'], FILTER_VALIDATE_BOOLEAN); 
$userName = $userData["name"]; 
$dataEncrypt = $adminVal.$userName; 
$encrypted = openssl_encrypt($dataEncrypt, "AES-256-XTS", $key, 0, $iv); 

:

여기에 내 모든 코드는 내가 원하는 암호화 된 문자열을 구축하기 위해 사용하고있다.

+1

당신이'AES-256 XTS'을 사용하고있는 방법이 될 것으로 보인다. 예를 들어'aes128' 또는'AES-128-CBC'로 바꾸면 결과가 보일 것입니다. http://php.net/manual/en/function.openssl-encrypt.php 문서를 참고하십시오 - 설명서에는 AES-256-XTS가 없습니다. –

+0

@ Fred-ii- 당신은 절대적으로 맞습니다, 고마워요! 나는 내가 그걸 보지 못했다니 믿을 수 없어. 나는 너에게 답을주고 싶다. –

+0

당신은 대단히 환영합니다. Adam, * 건배 * –

답변

3

@ Fred-ii- 당신이 정말 옳았습니다. 감사합니다! 나는 내가 그걸 보지 못했다니 믿을 수 없어. 나는 너에게 답을주고 싶다. 요청으로

는 :

당신이 AES-256-XTS을 사용하고있는 방법이 될 것으로 보인다. 예를 들어 aes128 또는 AES-128-CBC으로 변경하면 결과가 표시됩니다. 설명서를 참조하십시오 http://php.net/manual/en/function.openssl-encrypt.php - 설명서에 나열된 AES-256-XTS은 없습니다.

편집 : 버그 리포트를 이전 편집에서 삭제했습니다. 버그 리포트가 삭제 된 이유에 대해 자세히 조사하겠습니다.

var_dump(openssl_get_cipher_methods());을 실행할 때 (암호) 방법이 존재하기 때문에 또한 openssl에 의존 할 수 있습니다. 버그 보고서에 남겨진 주석에서 가져온/취한 것. OP의 테스트 및 자체 테스트가 비어있는 이유와 OP에서 자세한 정보를 얻는 방법에 대한 결과/설명을 얻을 수 있다면 답을 업데이트 할 것입니다.


편집 :

더 많은 연구를하고 후에, 나는 this link 우연히 그 코드는 "AES-256 XTS"암호화 방법을 사용하여 "상자에서 꺼내 자마자"근무 (참고 : 마지막 부분의 소스 스크립트에서 주석 처리 된 줄 참고를 참고하십시오).

해당 코드를보고 OP와 비교하면 암호화해야하는 데이터/메시지임을 알게되었습니다.

  • 메시지가 "키로"해시 처리되어 문자열을 비 웁니다. 기존의 해싱 방법을 메시지와 키 을 "키로 사용하여"모두 암호화하려고 했으므로 키와 데이터/메시지 모두를 해시하지 말고.

    (!) 참고 :

는 결과 스크립트는 다음과 같은 것으로 나왔다 바로 아래 주석 처리 된 줄도 각각의 부분 작업; 동시에 둘 다 사용하지 마십시오.

$plaintext = 'The secret message in plain text'; 
$password = '3sc3RLrpd17'; 
$key = substr(hash('sha256', $password, true), 0, 32); 

$iv = openssl_random_pseudo_bytes(16); 
$method = "aes-256-xts"; 
$userName = "JOHN"; 
$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv)); 
// $encrypted = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv); 

    echo "<br>"; 
    var_dump($iv); 
    echo "<br>"; 
    var_dump($userName); 
    echo "<br>"; 
    var_dump($encrypted); 
    echo "<hr>"; 

$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $key, OPENSSL_RAW_DATA, $iv); 
// $decrypted = openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv); 
    echo 'decrypted to: ' . $decrypted . "\n\n"; 

특별 참고 사항 : 나는 또한 Jay Blanchard's 두뇌와 테스트; 2 개의 머리는 1보다는 수시로 더 낫다, 그래서 Jay는 이것을위한 신용을 가치가있다.

참고 : 파일 시스템/디스크 암호화를위한 소스가 두 개 이상 ("AES-256-XTS")임을 나타냅니다. "AES-256-XTS 및 AES-128-XTS"방법은 파일 시스템 암호화를위한 것이므로 텍스트에는 적합하지 않습니다.

소스 코드는 this link에서 가져온 :

<?php 

$plaintext = 'My secret message 1234'; 
$password = '3sc3RLrpd17'; 
$method = 'aes-256-cbc'; // I replaced aes-256-cbc with aes-256-xts during testing 

// Must be exact 32 chars (256 bit) 
$password = substr(hash('sha256', $password, true), 0, 32); 
echo "Password:" . $password . "\n"; 

// IV must be exact 16 chars (128 bit) 
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0); 

// av3DYGLkwBsErphcyYp+imUW4QKs19hUnFyyYcXwURU= 
$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $password, OPENSSL_RAW_DATA, $iv)); 

// My secret message 1234 
$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $password, OPENSSL_RAW_DATA, $iv); 

echo 'plaintext=' . $plaintext . "\n"; 
echo 'cipher=' . $method . "\n"; 
echo 'encrypted to: ' . $encrypted . "\n"; 
echo 'decrypted to: ' . $decrypted . "\n\n"; 
+1

사용할 수있는 암호화 방법 목록을 보려면 [openssl_get_cipher_methods()] (http://php.net/manual/en/function.openssl-get-cipher-methods.php)를 사용하십시오. –

+1

내 용서를 용서해 ... 어떻게 PHP (또는 PHP-OpenSSL)가 false를 반환하거나 예외를 던져서 실패를 표시하지 않습니까? 일종의 나에게 파산 한 것 같습니다. – jww

+1

@jww 아주 이상합니다. 나는 이것을 "AES-256-XTA"를 사용하여 "C"를 OP의 코드에서 "A"로 바꾸고 경고를 던졌다. 그러나 "C"는 그렇지 않았습니다. "X"또는 "aaa"를 사용하는 경우에도 같은 일이 발생합니다. 이것은 버그 보고서의 가치가있을 수 있습니다. –