2013-04-25 19 views
5

Ho trovato domande simili, ma nessuna risposta chiara per questa domanda. Ho questa tabella:Perché AES_DECRYPT restituisce 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; 

Questa affermazione viene eseguito bene:

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

Ma, questo restituisce un valore nullo:

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

Perché questo ritorno NULL?

FWIW, questo restituisce "testvalue" come previsto:

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

@owlstead l'ho fatto. È in entrambe le istruzioni INSERT e SELECT. Il campo che sto selezionando è 'firstName' dalla tabella' testTable'. – user1091949

+0

Oh, questo sei stato tu, mio ​​errore, grazie per averlo segnalato :) Puoi accettare la tua risposta dopo un whilte –

risposta

9

La risposta è che le colonne sono binary quando dovrebbero essere varbinary. This article lo spiega:

Perché se AES_DECRYPT() rileva i dati non validi o non corretta imbottitura, verrà restituito NULL.

Con i tipi di colonna binary di lunghezza fissa, la lunghezza del valore di input deve essere nota per garantire il riempimento corretto. Per valori di lunghezza sconosciuti, utilizzare varbinary per evitare problemi con padding errato derivante da lunghezze di valori diversi.

+0

Ehi, stavo solo sperimentando le funzioni AES, e avevo impostato il mio campo 'email_id' su' varbinary (30) '. E per un'e-mail di lunghezza> 16, l'output 'AES_ENCRYPT' probabilmente aveva una lunghezza di 30 + padding. E quando ho usato AES_DECRYPT sui miei dischi, quel particolare record mostrava null, dopo aver modificato la dimensione di 'email_id' in' varbinary (50) ' Quindi è diventato NULL su AES_DECRYPT a causa di ciò che stai dicendo o perché ho cambiato la dimensione di 'email_id' a 50? –

-1

Quando si inseriscono dati binari in un campo VARCHAR ci sono alcuni caratteri binari che un VARCHAR non può gestire e si incasinano nel valore inserito. E poi il valore inserito non sarà lo stesso quando lo recupererai. 1.seleziona hex (aes_encrypt (file, 'chiave')); 2.seleziona aes_decrypt (unhex (file), 'chiave');

0

Verificare se il tipo di campo è blob invece binario (32)

Problemi correlati