gpt4 book ai didi

sql - 如何在 SQL SERVER 2016+ 中生成 SHA-3(256) 哈希

转载 作者:行者123 更新时间:2023-12-04 09:04:20 24 4
gpt4 key购买 nike

如何在 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);
}
}
}
  • 将 CLR .dll 部署到 SQL Server
    作为引用,这里是微软关于如何部署 CLR .dll 的文档
    https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration/deploying-clr-database-objects?view=sql-server-ver15
  • 将函数部署到 SQL Server
    CREATE FUNCTION dbo.GetHashHybrid(@algorithm NVARCHAR(4000),@input VARBINARY(MAX))
    RETURNS VARBINARY(8000) WITH SCHEMABINDING
    AS
    BEGIN
    RETURN (
    SELECT dbo.GetHash(@algorithm,@input)
    )
    END
  • 调用 dbo.GetHash
    DECLARE @INPUT VARCHAR(MAX);
    SELECT @INPUT = REPLICATE(CAST('test1' AS VARCHAR(MAX)),2000);
    SELECT dbo.GetHash('MD5',CONVERT(VARBINARY(MAX),@INPUT));

  • 此示例显示 MD5 散列,但演示了如何使用 CLR 创建散列功能的概念,该功能当前不受 SQL Server 的“开箱即用”支持。

    关于sql - 如何在 SQL SERVER 2016+ 中生成 SHA-3(256) 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63490256/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com