在C#和mysql中创建一个相同的sha512

时间:2011-12-19 01:10:30

标签: c# mysql sql

我想在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 

我从字节比较它们, 但结果彼此不同:(

感谢您的帮助!

最好的问候约翰

1 个答案:

答案 0 :(得分:2)

MySql返回一个十六进制编码的字符串:

  

从MySQL 5.5.6开始,返回值是一个非二进制字符串   连接字符集。在5.5.6之前,返回值是二进制   串;请参阅本节开头关于使用的注释   value作为非二进制字符串。

你可以知道这种情况正在发生,因为C#的第一个字节是2380xee,而e的ASCII代码是101 - MySql的返回开始于101 101。因此,您只需要使用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 )*/);