Как сгенерировать хэш SHA-3 (256) в SQL SERVER 2016

#sql #sql-server #hash

#sql #sql-сервер #хэш

Вопрос:

Как я могу сгенерировать хэш SHA-3 (256) в SQL Server 2016?

Похоже, что хэш-байты доходят только до SHA-2 (256) или SHA-2 (512).

Microsoft 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
  

Комментарии:

1. Это потому, что он не встроен, извините. Сделайте это на стороне клиента или (если вы должны сделать это на стороне базы данных) с помощью функции CLR. Проблема функции CLR в том, что она также не встроена в .NET Framework; вам нужно будет использовать пользовательские библиотеки.

2. У меня было ощущение, что все идет именно так. Мы работаем над проектом извлечения данных, и нам необходимо хэшировать определенные столбцы данных при выводе экспортных данных. Мы используем либо SSIS, либо Talend для процессов экспорта, и ни у одного из них также нет встроенного способа сделать это.

3. К сожалению (для вас) внедрение SHA-3 не вызвало энтузиазма, и поддержка отсутствует даже во многих крипто-библиотеках OS (именно поэтому нет встроенной поддержки в .NET Framework или Core и, вероятно, причина этого также в SQL Server).

4. @JeroenMostert Спасибо вам за это. Это связано с запросом клиента, и, похоже, они хотят получить преимущество с этой точки зрения.

5. Учитывая все это, мне все равно было бы интересно узнать, действительно ли кто-нибудь заставил что-то подобное работать в процессе ETL или ELT и как они это сделали, однако.

Ответ №1:

Вы можете достичь хэширования SHA-3 256 с SQL Server CLR интеграцией

На GitHub есть проект, в котором большая часть работы уже выполнена за вас, и вы могли бы легко добавить к нему поддержку SHA3.

https://github.com/sedenardi/sql-hashing-clr

Не существует способа хэширования SHA3-256 с чистым ядром dotnet. Я рекомендую вам использовать библиотеку BouncyCastle (https://www.bouncycastle.org/csharp/index.html ), который поддерживает SHA3-256. Существует пакет библиотеки 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);
        }
    }
}
  
  1. Разверните CLR .dll на SQL Server

    Для справки вот документация Microsoft о том, как развернуть CLR .dll

    https://learn.microsoft.com/en-us/sql/relational-databases/clr-integration/deploying-clr-database-objects?view=sql-server-ver15

  2. Развернуть функцию на 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
      
  3. Вызовите 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 «из коробки».