SQL Server 2008 R2哈希字节SHA2返回null
我试图使用HASHBYTES和SHA2_512作为算法。但是,当我尝试在SQLServerManagementStudio中执行此操作时,得到的结果是空的SQL Server 2008 R2哈希字节SHA2返回null,sql,sql-server-2008,hash,Sql,Sql Server 2008,Hash,我试图使用HASHBYTES和SHA2_512作为算法。但是,当我尝试在SQLServerManagementStudio中执行此操作时,得到的结果是空的 SELECT HASHBYTES('SHA1','test') //works SELECT HASHBYTES('SHA2','test') //returns null 我做错了什么? 有没有办法查看SELECT HASHBYTES'SHA2','test'中的返回值 感谢SQL Server在SQL Server 2012+中支持SH
SELECT HASHBYTES('SHA1','test') //works
SELECT HASHBYTES('SHA2','test') //returns null
我做错了什么?
有没有办法查看SELECT HASHBYTES'SHA2','test'中的返回值
感谢SQL Server在SQL Server 2012+中支持SHA2 512
SQL Server 2008 R2及以下版本不支持SHA2_512。这是一个128、256和512位的小例子
DECLARE @HashThis nvarchar(4000);
SELECT @HashThis = CONVERT(nvarchar(4000),'This is a sample string');
SELECT HASHBYTES('SHA1', @HashThis);
SELECT HASHBYTES('SHA2_256', @HashThis);
SELECT HASHBYTES('SHA2_512', @HashThis);
GO
如果在CLR中使用用户定义的函数UDF,则可以在SQL Server 2008中返回SHA512哈希。下面是相关的部分,不包括如何在SQLServer中执行CLR的完整说明
首先,C CLR代码:
使用系统文本;
使用System.Data.SqlTypes;
使用Microsoft.SqlServer.Server;
使用System.Security.Cryptography;
公共部分类UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunctionDataAccess=DataAccessKind.Read]
[返回:SqlFacetMaxSize=-1]
公共静态SqlString哈希_string_sha512[SqlFaceMaxSize=-1]字符串值
{
SHA512Managed crypt=新的SHA512Managed;
string hashString=string.Empty;
byte[]crypto=crypt.ComputeHashEncoding.UTF8.GetBytesValue,0,Encoding.UTF8.GetByteCountValue;
加密中的foreach字节位
{
hashString+=位ToStringx2;
}
返回哈希字符串;
}
};
构建CLR项目,该项目将创建DLL。现在在数据库中为DLL创建程序集,并注册函数:
从“[PATH]\[DLL\u Name].DLL”创建程序集MyCode,权限设置为外部访问
创建函数hash\u字符串_sha512@valnvarcharmax返回nvarcharmax作为外部名称MyCode.UserDefinedFunctions.hash\u string\u sha512
现在您可以散列任何字符串:
选择dbo.hash\u string\u sha512'作为sha512哈希,它看起来像什么
返回散列:
42F8373D528CB64CDFA7EC4FFB2D754C7D4C37A28959506EC2413ACFE17500DB7940FFD887390CB543A8615A6000B4F6BCDB199BB56AF91BEC84780F236AAF8
哎呀,谢谢你指出这一点。我没有看到MSDN页面顶部的版本信息。这应该是正确的答案。这是因为sql版本。
DECLARE @HashThis nvarchar(4000);
SELECT @HashThis = CONVERT(nvarchar(4000),'This is a sample string');
SELECT HASHBYTES('SHA1', @HashThis);
SELECT HASHBYTES('SHA2_256', @HashThis);
SELECT HASHBYTES('SHA2_512', @HashThis);
GO