2011-12-19 8 views
2

C#とmysqlで同じsha512を作りたいと思います。C#とmysqlで同じsha512を作成します

C#

System.Security.Cryptography.SHA512.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes("test")); 

C#結果の長さ64

238 38 176 221 74 247 231 73 170 26 142 227 193 10 233 146 63 97 137 128 119 46 71 63 136 25 165 212 148 14 13 178 122 193 133 248 160 225 213 248 79 136 188 136 127 214 123 20 55 50 195 4 204 95 169 173 142 111 87 245 0 40 168 255 

のMySQL

INSERT INTO users_table (password) VALUES ( SHA2("test", 512)); 
// password is a BINARY(128) 

MySQLの結果の長さ128

101 101 50 54 98 48 100 100 52 97 102 55 101 55 52 57 97 97 49 97 56 101 101 51 99 49 48 97 101 57 57 50 51 102 54 49 56 57 56 48 55 55 50 101 52 55 51 102 56 56 49 57 97 53 100 52 57 52 48 101 48 100 98 50 55 97 99 49 56 53 102 56 97 48 101 49 100 53 102 56 52 102 56 56 98 99 56 56 55 102 100 54 55 98 49 52 51 55 51 50 99 51 48 52 99 99 53 102 97 57 97 100 56 101 54 102 53 55 102 53 48 48 50 56 97 56 102 102 

のバイト数で比較しますが、結果はお互いに異なります:(

助けてくれてありがとう!

よろしくは

+2

まず最初エンコーディングですミスマッチ。 MySQLはASCIIを使用していない可能性が高いですが、おそらく "test"のASCIIと同じものを使用しています。 MySQL接続の文字セットとは何ですか?また、2つのハッシュを投稿できますか? – Corbin

+0

私は今作業していますが、エラーの傾向が表示されます:D –

+0

いずれかのプラットフォームに文字列ターミネーターとして末尾の '0x00' ASCII NUL文字が含まれているかどうか知っていますか? – sarnold

答えて

2

MySQLは16進数でエンコードされた文字列を返しているヨハン:

のMySQL 5.5.6の時点では、戻り値は 接続キャラクタ・セットでは非バイナリ文字列です。 5.5.6より前の場合、戻り値はバイナリ 文字列です。非数値文字列として 値を使用する方法については、このセクションの冒頭の注を参照してください。

C# 'sの最初のバイトは238あるので、あなたは0xeeあり、そしてeのASCIIコードが101である、これが起こっている伝えることができます - MySQLのリターンは101 101で始まります。したがって、16進数でエンコードされた文字列をUNHEX(ただしMySql> 5.5.6のみ)のバイナリ文字列に変換するだけで済みます。

だからあなたの場合、同じ結果受信する:バージョン間で移植できるように

INSERT INTO users_table (password) VALUES (UNHEX(SHA2("test", 512))); 

MySql conditional comments使用(オハイオ州醜さを!):頭に浮かぶ

INSERT INTO users_table (password) VALUES (/*!50506 UNHEX(*/SHA2("test",512)/*!50506)*/); 
+0

多くの感謝! ! ! –