作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 SQL Server 2016 中生成 SHA-3 (256) 哈希?
HASHBYTES 似乎只能达到 SHA-2 (256) 或 SHA-2 (512)。
微软 BOL 并没有给我一个温暖和模糊的感觉,这是内置在任何地方。
-- SHA2-256
DECLARE @HashThis nvarchar(32);
SET @HashThis = CONVERT(nvarchar(32),'123456');
SELECT HASHBYTES('SHA2_256', @HashThis);
-- Output: 0xEC278A38901287B2771A13739520384D43E4B078F78AFFE702DEF108774CCE24
-- SHA3-256 (KECCAK)
DECLARE @HashThis nvarchar(32);
SET @HashThis = CONVERT(nvarchar(32),'123456');
SELECT HASHBYTES('SHA3_256', @HashThis);
-- Output: NULL
最佳答案
您可以使用 SQL Server CLR
实现 SHA-3 256 哈希。一体化
GitHub 上有一个项目已经为您完成了大部分工作,您可以轻松地为其添加 SHA3 支持。
https://github.com/sedenardi/sql-hashing-clr
无法使用纯 dotnet 核心进行 SHA3-256 散列。我建议您使用支持 SHA3-256 的 BouncyCaSTLe 库 ( https://www.bouncycastle.org/csharp/index.html )。有一个 nuget 库包,它是 BouncyCaSTLe 之上的一个包装器,可以使 SHA3-256 散列相对容易实现。 https://www.nuget.org/packages/SHA3.Net/ .您需要使用此软件包并更新 HashUtil.cs
先决条件:构建 CLR .dll
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Security.Cryptography;
-- include NugetPackage to help with SHA-3 hashing
public class HashUtil
{
[SqlFunction(IsDeterministic = true)]
public static SqlBinary GetHash(SqlString algorithm, SqlBytes src)
{
if (src.IsNull)
return null;
switch (algorithm.Value.ToUpperInvariant())
{
case "MD5":
return new SqlBinary(MD5.Create().ComputeHash(src.Stream));
case "SHA1":
return new SqlBinary(SHA1.Create().ComputeHash(src.Stream));
case "SHA2_256":
return new SqlBinary(SHA256.Create().ComputeHash(src.Stream));
case "SHA2_512":
return new SqlBinary(SHA512.Create().ComputeHash(src.Stream));
-- add SHA3-256
default:
throw new ArgumentException("HashType", "Unrecognized hashtype: " + algorithm.Value);
}
}
}
CREATE FUNCTION dbo.GetHashHybrid(@algorithm NVARCHAR(4000),@input VARBINARY(MAX))
RETURNS VARBINARY(8000) WITH SCHEMABINDING
AS
BEGIN
RETURN (
SELECT dbo.GetHash(@algorithm,@input)
)
END
DECLARE @INPUT VARCHAR(MAX);
SELECT @INPUT = REPLICATE(CAST('test1' AS VARCHAR(MAX)),2000);
SELECT dbo.GetHash('MD5',CONVERT(VARBINARY(MAX),@INPUT));
关于sql - 如何在 SQL SERVER 2016+ 中生成 SHA-3(256) 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63490256/
我是一名优秀的程序员,十分优秀!