c # tripleDESCrypto enregistré et récupéré à partir sql ne fonctionne pas

StackOverflow https://stackoverflow.com/questions/4830969

  •  27-10-2019
  •  | 
  •  

Question

hey là, donc dans une base de données MSSQL que je sauvegarde et la récupération de l'utilisation des procédures stockées. Je suis en train de chiffrer des données dans le c fenêtres # forme avant d'être placé, puis de cours quand le décryptage je retirer. tout le cryptage est en cours de traitement sur le côté c #. J'utilise l'exemple de code pour le chiffrement et le déchiffrement de mot à mot tripleDESCryptoService classe de Microsoft (la version de la mémoire, 2ème exemple). Les valeurs se cryptées et envoyées à la base de données, mais lors de la récupération j'obtenir une erreur « mauvaise de données ». un échantillon de l'appel de cryptage est ...

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);

txt_Last_Name est ensuite envoyé à la base de données, et je peux voir qu'il ya quelque chose dans la base de données. dans la base de données, le nom est de type varchar (20)

échantillon de l'appel de décryptage est ...

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;

it bombes dans la fonction de décryptage à: "csDecrypt.Read (fromEncrypt, 0, fromEncrypt.Length);" et je ne comprends pas pourquoi. Je ne sais pas si elle ne se stocké dans la base de données correctement, ou mes conversions ne sont pas bonnes.

si cela signifie quelque chose, le « Data » entrée dans la fonction de déchiffrement est de taille 16 et contient des valeurs non nulles, mais le « byte [] fromEncrypt » est une matrice de taille 16 contenant tous les zéros.

Merci pour toute aide!

Était-ce utile?

La solution

EDIT: D'accord. Nous avons au fond de celui-ci ... bien que la question ASCII aurait mordu trop

Chaque fois que vous créez un nouveau TripleDESCryptoServiceProvider et demandez une clé / IV, il va générer un nouveau. Vous devez stocker en toute sécurité que quelque part, comme il est nécessaire pour décrypter les données. Sinon, vous n'avez pas « secret » il est donc pas vraiment cryptage ...


Ceci est une idée terrible:

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

Vous avez obtenu des données binaires arbitraires tempByte. Ne pas de supposer qu'il texte ASCII valide. C'est presque certainement où vous perdre des données.

Convert.ToBase64String et Convert.FromBase64String aux données binaires en toute sécurité opaques encode sous forme de texte.

De plus, cela est une mauvaise idée:

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

Quel est le point de créer un tableau d'octets si vous allez alors l'ignorer? Utilisez

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

au lieu. Oh, et essayez de suivre les conventions de nommage .NET:)

Après avoir dit tout cela, si votre cryptage retourne toujours un tableau d'octets de 16 zéros, qui est un signe assez sûr que votre méthode de encrypt est cassé. Nous ne pouvons pas vraiment aider jusqu'à ce que vous poster le code pour cette méthode.

Enfin, si votre colonne est de type varchar(20) vous devez savoir que cela peut très bien ne pas contenir toutes les données dont vous avez besoin pour ... surtout si vous allez inclure un sel. Base64 augmentera la taille des données un peu, et le cryptage peut le faire aussi. Comme mentionné dans une autre réponse, le stockage ce que binaire dans la base de données serait plus sensible à bien des égards.

(Note:. Même si vous as veulent utiliser ce code, j'écririez comme txt_Last_Name.Text = Encoding.ASCII.GetString(tempByte); directives sont à l'aide de votre ami, et ASCII est une propriété de Encoding, non ASCIIEncoding.)

Autres conseils

Il suffit de lire la doc ... vous devez convertir votre byte [] à l'aide d'une chaîne Convert.ToBase64String().

Soit Convert.ToBase64String (), comme recommandé pascals ci-dessus, ou stocker les données sous forme binaire dans votre base de données au lieu du texte (la solution préférée, car il utiliserait moins d'espace). Dans SQL Server, il y a un type de données VARBINARY (MAX) dans ce but.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top