Domanda

Hey there, quindi in un database MSSQL che sto salvataggio e il recupero di utilizzare le stored procedure. Sto cercando di crittografare alcuni dati in C # Windows Form, prima di essere immessi, e poi naturalmente decifrare quando mi tiro indietro. tutta la crittografia viene gestita sul lato c #. Sto utilizzando il codice di esempio per la crittografia e la decrittografia testualmente tripleDESCryptoService Classe di Microsoft (la versione di memoria, 2 ° esempio). I valori vengono criptati e inviati al database, ma quando il recupero si ottengo un errore "dati non validi". un campione della chiamata crittografia è ...

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);
txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);

il txt_Last_Name viene poi inviato alla banca dati, e posso vedere che c'è qualcosa nel database. nel database, il cognome è di tipo varchar (20)

campione della chiamata decrittazione è ...

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
string lastName = dr.GetString(dr.GetOrdinal("Last Name"));
if (isEncrypted)
{
     byte[] toDecrypt = new ASCIIEncoding().GetBytes(lastName);
     lastName = decrypt(toDecrypt, tDESalg.Key, tDESalg.IV);                    
}
txt_Last_Name.Text = lastName;

esso bombe in funzione di decifratura a: "csDecrypt.Read (fromEncrypt, 0, fromEncrypt.Length);" e non capisco perché. non sono sicuro se non è sempre memorizzato nel database in modo corretto, o le mie conversioni non sono giuste.

se significa nulla, il "dati" che entra in funzione decifrare è di dimensione 16 e contiene non valori zero, ma il "byte [] fromEncrypt" è un array di dimensione 16 contenente tutti zeri.

Grazie per qualsiasi aiuto!

È stato utile?

Soluzione

EDIT:. Va bene, abbiamo avuto modo di fondo di esso ... anche se la questione ASCII avrebbe morso troppo

Ogni volta che si crea un nuovo TripleDESCryptoServiceProvider e chiedere per una chiave / IV, verrà generato uno nuovo. È necessario memorizzare in modo sicuro che da qualche parte, come è necessario per decodificare i dati. In caso contrario, non si dispone di alcun "segreto" quindi non è davvero la crittografia ...


Questa è una pessima idea:

txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);

Hai avuto dati binari arbitrari in tempByte. Non per scontato che sia testo ASCII valido. Che è quasi certamente in cui si sta perdendo i dati.

Convert.ToBase64String e Convert.FromBase64String per i dati binari in modo sicuro codificare opachi come testo.

Inoltre, questa è una cattiva idea:

byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);

Qual è il punto di creare un array di byte, se si sta andando poi a ignorarlo? Usa

byte[] tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);

, invece. Oh, e cercare di seguire le convenzioni di denominazione NET:)

Detto tutto questo, se la crittografia è sempre restituisce un array di byte di 16 zeri, che è un segno abbastanza sicuro che il metodo encrypt è rotto. Non possiamo davvero aiuto là fino a quando non pubblicare il codice per quel metodo.

Infine, se la vostra colonna è di tipo varchar(20) si deve essere consapevoli che questo può benissimo non contenere tutti i dati necessari a ... soprattutto se avete intenzione di includere un sale. Base64 aumenterà la dimensione dei dati in qualche modo, e la crittografia può farlo anche. Come già detto in un'altra risposta, la memorizzazione di questo come binario nel database sarebbe più sensato in molti modi.

. (Nota: anche se si ha vuole utilizzare quel codice, mi piacerebbe scrivere come txt_Last_Name.Text = Encoding.ASCII.GetString(tempByte); utilizzando direttive sono tuo amico, e ASCII è una proprietà di Encoding, non ASCIIEncoding.)

Altri suggerimenti

leggere il doc ... si dovrebbe convertire il byte [] per una stringa utilizzando Convert.ToBase64String().

In entrambi i Convert.ToBase64String (), come raccomandato sopra pascal, o memorizzare i dati in formato binario nel database al posto del testo (la soluzione preferita, dato che sarebbe utilizzare meno spazio). In SQL Server, c'è un VARBINARY (MAX) tipo di dati per questo scopo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top