2013-04-25 4 views
5

비슷한 질문을 찾았지만이 질문에 대한 명확한 답이 없습니다. 이 문은 잘 실행AES_DECRYPT가 null을 반환하는 이유는 무엇입니까?

CREATE DATABASE testDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

CREATE TABLE testTable 
(
firstName binary(32) not null, 
lastName binary(32) not null 
/* Other non-binary fields omitted */ 
) 
engine=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

: :이 테이블이

INSERT INTO testTable (firstName) VALUES (AES_ENCRYPT('Testname', 'test')); 

을하지만,이 반환 NULL :

SELECT AES_DECRYPT(firstName, 'test') FROM testTable; 

이 반환 NULL 않는 이유는 무엇입니까?

SELECT AES_DECRYPT(AES_ENCRYPT('testValue','thekey'), 'thekey'); 
+0

인 것을 확인하십시오. INSERT 및 SELECT 문 모두에 있습니다. 내가 선택한 필드는'testTable' 테이블에서'firstName'입니다. – user1091949

+0

오, 당신, 내 실수, 그보고를 주셔서 감사합니다 :) 당신은 whilte 후 자신의 대답을 받아 들일 수 –

답변

9

대답은 그들이 varbinary을해야 할 때 열이 binary을 있다는 것입니다 :

FWIW이 예상대로 "testValue"를 반환합니다. This article는 설명 :

AES_DECRYPT()가 잘못된 데이터 또는 잘못된 패딩을 감지하면 때문에이 NULL을 반환합니다.

binarybinary 열 유형이 고정 길이 인 경우 입력 값의 길이가 올바른 채우기를 보장해야합니다. 길이 값을 알 수없는 경우 varbinary을 사용하면 값 길이가 다르기 때문에 잘못된 채움 문제를 피할 수 있습니다.

+0

이봐, 난 그냥 AES 기능을 실험하고 있었고, 나는'email_id' 필드를'varbinary 30)'. 길이가 16보다 큰 이메일의 경우 'AES_ENCRYPT'출력의 길이는 아마도 30 + 패딩입니다. 그리고 내 레코드에 AES_DECRYPT를 사용했을 때,'email_id'의 크기를'varbinary (50) '로 변경 한 후에 그 특정 레코드가 null로 표시되었습니다. 당신이 말한 것 때문에 AES_DECRYPT에서 NULL로 바뀌 었습니다. 'email_id '의 크기를 50으로 변경했기 때문에? –

-1

VARCHAR 필드에 2 진 데이터를 삽입 할 때 VARCHAR에서 처리 할 수없는 2 진 문자가 있으며 삽입 된 값으로 엉망이됩니다. 삽입 된 값은 검색 할 때 동일하지 않습니다. 1. 선택 헥스 (aes_encrypt (file, 'key')); 2. 선택 aes_decrypt (unhex (file), 'key');

0

필드 형식이 blob 대신에 blob (32)

관련 문제