c#ripledescryptoが保存され、SQLから取得していない
質問
ちょっとそこにあるので、MSSQLデータベースでは、保存してストアドプロシージャの使用から取得しています。配置される前に、C#Windowsフォームにいくつかのデータを暗号化しようとしています。すべての暗号化はC#側で処理されています。暗号化と復号化のためにサンプルコードを使用しています MicrosoftのTripledescryptoserviceクラス (メモリバージョン、2番目の例)。値は暗号化され、データベースに送信されますが、取得すると「悪いデータ」エラーが発生します。暗号化呼び出しのサンプルは...
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がデータベースに送信され、データベースに何かがあることがわかります。データベースでは、姓はvarchar(20)のタイプです
復号化コールのサンプルは...
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;
復号化関数で爆弾:「csdecrypt.read(fromecrypt、0、fromecrypt.length);」そして、私は理由がわかりません。データベースに正しく保存されていないのか、それとも私の変換が正しくないのかはわかりません。
それが何かを意味する場合、復号化関数に入る「データ」はサイズ16で、ゼロ以外の値が含まれていますが、「byte [] fromecrypt」はすべてのゼロを含むサイズ16の配列です。
助けてくれてありがとう!
解決
編集:さて、私たちはその一番下にあります... ASCIIの問題も噛まれていたでしょう。
新しいものを作成するたびに TripleDESCryptoServiceProvider
キー/IVを尋ねると、新しいものが生成されます。データを復号化する必要があるため、どこかにしっかりと保存する必要があります。それ以外の場合は、「秘密」がないので、実際には暗号化ではありません...
これはひどい考えです:
txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);
任意のバイナリデータがあります tempByte
. しないでください 有効なASCIIテキストであると仮定します。それはほぼ確実にあなたがデータを失っている場所です。
使用する Convert.ToBase64String
と Convert.FromBase64String
不透明なバイナリデータをテキストとして安全にエンコードします。
さらに、これは悪い考えです:
byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);
あなたがそれを無視するならば、バイト配列を作成することのポイントは何ですか?使用する
byte[] tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);
代わりは。ああ、そして.NETの命名規則に従ってみてください:)
これをすべて言った後、暗号化が常に16ゼロのバイト配列を返している場合、それはあなたのかなり確実な兆候です encrypt
方法が壊れています。あなたがその方法のコードを投稿するまで、私たちは本当にそこでは助けられません。
最後に、列がタイプの場合 varchar(20)
必要なデータをすべて保持しているわけではないことに注意する必要があります。特に、塩を含める場合は特に。 Base64はデータのサイズを多少増加させ、暗号化もそうすることができます。別の答えで述べたように、これをバイナリとして保存します データベース内 多くの点でより賢明です。
(注:たとえあなたであっても やりました そのコードを使用したい、私はそれを次のように書きます txt_Last_Name.Text = Encoding.ASCII.GetString(tempByte);
. 。指令を使用することはあなたの友達です ASCII
のプロパティです Encoding
, 、 いいえ ASCIIEncoding
.)
他のヒント
ただ ドキュメントを読む...バイト[]を使用して文字列に変換する必要があります Convert.ToBase64String()
.
Pascalが上記で推奨するように、Tobase64String()をConvert.tobase64String()、またはテキストの代わりにデータベースにバイナリとして保存します(より少ないスペースを使用するため、優先ソリューション)。 SQL Serverには、この目的のためにVarbinary(Max)データ型があります。