sql server-C#中的MD5哈希代码

本文关键字:哈希 代码 MD5 中的 server-C# sql | 更新日期: 2023-09-27 18:00:14

如何绕过SQL Server 2012、中创建哈希代码的8000个限制字符

 select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', 'Sample
 string with more than 8000 Characters')),3,32) as MD5HashCode

我尝试使用C#语法。

String  str = "Sample string with more than 8000 Characters"
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.Unicode.GetBytes(str);
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
  foreach (byte b in bs)
  {
    s.Append(b.ToString("x2").ToLower());
  }

但是计算的HashCodeSQL查询在C#语法中是不同的。

提前感谢。

sql server-C#中的MD5哈希代码

当使用SQL Server的varchar数据类型时,.Net编码是UTF8,因为它是三种(ASCII、UTF7、UTF8)中最快、优化程度最高的。当使用nvarchar数据类型时,go是Unicode(UTF16),但我们也必须知道文本字节序才能创建正确的哈希。

示例

DotNet:

string source = "Sample string with more than 8000 Characters";
using (MD5 md5Hash = MD5.Create()) 
{ 
    Console.WriteLine(GetMd5Hash(md5Hash, source, System.Text.Encoding.ASCII)); <br/>Console.WriteLine(GetMd5Hash(md5Hash, source, System.Text.Encoding.UTF7));
    Console.WriteLine(GetMd5Hash(md5Hash, source, System.Text.Encoding.UTF8));  
    Console.WriteLine(GetMd5Hash(md5Hash, source,System.Text.Encoding.Unicode)); 
    Console.WriteLine(GetMd5Hash(md5Hash, source, System.Text.Encoding.UTF32)); 
}

DotNet图像

数据库:

--注意所有数据类型的大小为15

declare @val1 varchar(50),
    @val2 nvarchar(50),
    @val3 char(50),
    @val4 nchar(50)

--1字节/字符文本的示例
--所有变量的长度都相同

select  @val1 =  'Sample string with more than 8000 Characters'
    @val2 = N'Sample string with more than 8000 Characters',
    @val3 =  'Sample string with more than 8000 Characters',
    @val4 = N'Sample string with more than 8000 Characters'

--所有4个返回不同的结果

select  HASHBYTES('md5', @val1) as MD5_varchar,    
-- result = 0xAE1C585474D90965ED832A7E588D4AF4
-- just to show that collation doesnot change the hash
HASHBYTES('md5', @val1 collate Cyrillic_General_BIN2) as MD5_varchar_collation, 
-- result = 0xAE1C585474D90965ED832A7E588D4AF4
HASHBYTES('md5', @val2) as MD5_Nvarchar,    
-- result = 0x880632484491D1283818B7A3AE3D2AFC
HASHBYTES('md5', @val3) as MD5_char,        
-- result = 0x77D2A2CF22998C4CD5AD5550664BF931
HASHBYTES('md5', @val4) as MD5_Nchar        
-- result = 0x9B55DF00EAFE01D764BB944592C27521

数据库图像