#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);
}
}
}
-
Разверните CLR .dll на SQL Server
Для справки вот документация Microsoft о том, как развернуть CLR .dll
-
Развернуть функцию на 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 «из коробки».