Frage

Hey, also in einer MSSQL -Datenbank, die ich speichere und abrufe, indem ich gespeicherte Prozeduren verwendet. Ich versuche, einige Daten im C# Windows -Formular zu verschlüsseln, bevor ich platziert werde, und entschlüss mich dann natürlich, wenn ich sie zurückziehe. Die gesamte Verschlüsselung wird auf der C# -Seite behandelt. Ich verwende den Beispielcode für Verschlüsselung und Entschlüsselung wörtlich von Microsoft's TripledescryptoService -Klasse (Die Speicherversion, 2. Beispiel). Die Werte werden verschlüsselt und an die Datenbank gesendet, aber beim Abrufen erhalte ich einen "schlechten Daten" -Fehler. Eine Stichprobe des Verschlüsselungsaufrufs ist ...

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

Der txt_last_name wird dann an die Datenbank gesendet, und ich kann sehen, dass in der Datenbank etwas vorhanden ist. In der Datenbank ist der Nachname vom Typ varchar (20)

Die Probe des Entschlüsselungsaufrufs ist ...

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;

Es bomben in der Entschlüsselungsfunktion bei: "csDecrypt.read (FromCrypt, 0, Fromcrypt.length);" Und ich verstehe nicht warum. Ich bin mir nicht sicher, ob es nicht korrekt in der Datenbank gespeichert wird oder meine Conversions nicht richtig sind.

Wenn es etwas bedeutet, besteht die "Daten", die in die Entschlüsselungsfunktion eingehen, von Größe 16 und enthält ungleich Nullwerte, aber das "Byte [] Fromcrypt" ist ein Array von Größe 16, das alle Nullen enthält.

Danke für jede Hilfe!

War es hilfreich?

Lösung

Bearbeiten: Okay, wir haben den Grund ... obwohl das ASCII -Problem auch gebissen hätte.

Jedes Mal, wenn Sie eine neue erstellen TripleDESCryptoServiceProvider und bitten Sie es um einen Schlüssel/IV, es wird eine neue erzeugen. Sie müssen so sicher irgendwo speichern, da es erforderlich ist, um die Daten zu entschlüsseln. Ansonsten hast du kein "Geheimnis", also ist es nicht wirklich Verschlüsselung ...


Dies ist eine schreckliche Idee:

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

Sie haben willkürliche Binärdaten in tempByte. Nicht Angenommen, es ist ein gültiger ASCII -Text. Das ist mit ziemlicher Sicherheit, wo Sie Daten verlieren.

Verwenden Convert.ToBase64String und Convert.FromBase64String Um sicher zu uquen Binärdaten als Text zu codieren.

Darüber hinaus ist dies eine schlechte Idee:

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

Was bringt es, ein Byte -Array zu erstellen, wenn Sie es dann ignorieren? Verwenden

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

stattdessen. Oh, und versuche .NET -Namenskonventionen zu folgen :)

Trotzdem ist das, wenn Ihre Verschlüsselung immer ein Byte -Array von 16 Nullen zurückgibt, ein ziemlich sicher encrypt Methode ist gebrochen. Wir können dort nicht wirklich helfen, bis Sie den Code für diese Methode veröffentlichen.

Schließlich, wenn Ihre Spalte vom Typ ist varchar(20) Sie sollten sich darüber im Klaren sein, dass dies möglicherweise nicht alle Daten enthält, die Sie benötigen ... insbesondere, wenn Sie ein Salz enthalten. Base64 erhöht die Größe der Daten etwas und kann dies auch tun. Wie in einer anderen Antwort erwähnt, speichern Sie dies als binär in der Datenbank wäre in vielerlei Hinsicht sinnvoller.

(Hinweis: Auch wenn Sie tat Ich möchte diesen Code verwenden, ich würde ihn schreiben als txt_Last_Name.Text = Encoding.ASCII.GetString(tempByte);. Verwenden von Anweisungen sind Ihr Freund und ASCII ist eine Eigenschaft von Encoding, nicht ASCIIEncoding.)

Andere Tipps

Gerade Lesen des Doc... Sie sollten Ihr Byte [] in eine Zeichenfolge konvertieren Convert.ToBase64String().

Entweder konvert.tobase64string (), wie oben empfohlen, oder speichern Sie die Daten als binär in Ihrer Datenbank anstelle von Text (der bevorzugten Lösung, da sie weniger Platz nutzen würde). In SQL Server gibt es zu diesem Zweck einen Varbarbinary -Datentyp (maximal).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top