如何在SQL Server 2016及以上版本生成SHA-3(256)哈希值
在SQL Server 2016中生成SHA-3(256)哈希值的方案
确实,SQL Server 2016的HASHBYTES函数仅支持SHA-2系列算法(SHA2_256、SHA2_512等),官方文档里也没有提及内置SHA-3的支持,这就是你调用HASHBYTES('SHA3_256', ...)返回NULL的原因。下面给你两种可行的解决方案:
一、使用CLR自定义函数(推荐,性能高效)
SQL Server支持通过CLR集成调用.NET的加密库,而.NET Framework 4.6及以上已经内置了SHA-3算法的实现,我们可以通过创建CLR函数来实现SHA3-256哈希计算。
步骤1:编写C#类库代码
创建一个C#类库项目,添加以下代码:
using System; using System.Data.SqlTypes; using System.Security.Cryptography; using Microsoft.SqlServer.Server; public class HashUtilities { // 定义SQL可调用的SHA3-256函数 [SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)] public static SqlBytes ComputeSHA3_256(SqlString inputStr) { if (inputStr.IsNull) return SqlBytes.Null; // 使用.NET内置的SHA3算法 using (var sha3Provider = SHA3.Create("SHA3-256")) { byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(inputStr.Value); byte[] hashResult = sha3Provider.ComputeHash(inputBytes); return new SqlBytes(hashResult); } } }
编译这个项目生成DLL文件(注意选择和SQL Server兼容的.NET Framework版本,SQL Server 2016支持4.0及以上)。
步骤2:在SQL Server中注册CLR函数
以管理员权限执行以下SQL语句:
-- 开启CLR集成(默认是关闭的) sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'clr enabled', 1; RECONFIGURE; GO -- 注册编译好的DLL程序集(替换为你的DLL实际路径) CREATE ASSEMBLY HashUtilitiesAssembly FROM 'C:\YourPath\HashUtilities.dll' WITH PERMISSION_SET = SAFE; GO -- 创建自定义T-SQL函数,映射到CLR方法 CREATE FUNCTION dbo.SHA3_256(@input NVARCHAR(MAX)) RETURNS VARBINARY(32) AS EXTERNAL NAME HashUtilitiesAssembly.HashUtilities.ComputeSHA3_256; GO
步骤3:调用自定义函数
现在就可以像使用内置函数一样调用了:
DECLARE @HashThis NVARCHAR(32); SET @HashThis = '123456'; SELECT dbo.SHA3_256(@HashThis); -- 预期输出:0xB751850B1A57168A5693CD924B6B096E08F621827444F70D884F5D0240D2712E
二、纯T-SQL实现KECCAK算法(无CLR权限时使用)
如果你的环境无法启用CLR集成,也可以使用纯T-SQL编写KECCAK-256的实现(SHA-3的底层算法是KECCAK)。不过这种方法代码量较大,性能远不如CLR,适合小批量数据场景。
你可以参考KECCAK的官方规范编写T-SQL函数,或者找到开源的实现。假设已经创建了dbo.KECCAK256函数,调用示例如下:
DECLARE @HashThis NVARCHAR(32); SET @HashThis = '123456'; SELECT dbo.KECCAK256(@HashThis);
额外提示
如果你有升级SQL Server的可能,SQL Server 2022及以后版本已经内置了SHA-3系列算法的支持,直接使用HASHBYTES('SHA3_256', @input)即可得到结果,无需额外配置。
内容的提问来源于stack exchange,提问作者SQLJax
相关产品推荐
相关产品推荐

