2017-01-31 21 views
2

Мне нужно сгенерировать базу SHA256 базы данных хэш из таблицы на SQL-сервере, но я не могу найти этот алгоритм в аргументах HASHBYTES list.SHA256 base 64 хэш-генерация в SQL Server

Есть ли способ сгенерировать его непосредственно в SQL Server?

Дубликат Юридическая информация:

Мой вопрос не дубликат SHA256 in T-sql stored procedure как я искал SHA256 базы 64 версия алгоритма, который не перечислен на странице.

Числовой пример

У меня есть этот результат запроса в SQL Server

Дата начала, Дата окончания, POD, Сумма, Валюта

2016-01-01,2016-12 -31,1234567890,12000, EUR

это дает мне следующую строку (с использованием concat Enate функция)

2016-01-012016-12-31123456789012000EUR

йота this convertion tool я получаю следующее окрошки

GMRzFNmm90KLVtO1kwTf7EcSeImq + 96QTHgnWFFmZ0U

что мне нужно для отправки клиенту.

+0

Возможный дубликат [SHA256 в хранимой процедуре T-sql] (http://stackoverflow.com/questions/2954784/sha256-in-t-sql-stored-procedure) – Tanner

+0

@Tanner, как написано в вопросе I Я ищу алгоритм базы SHA256 64, а не SHA256 HEX. По этой причине он не дублируется. – Nicolaesse

+0

Получение двоичного вывода из обычного SHA256 и кодирование его в base64 не подходит? В чем же разница? Можете ли вы предоставить ссылку на более подробное описание? –

ответ

6

Во-первых, предоставленная вами ссылка генератора выводит представление base64 в не совсем правильном формате. А именно, он опускает padding sequence. Хотя теоретически необязательно, дополнение применяется в MS SQL Server (проверено на версии 2012 и 2016 годов).

Имея это в виду, следующий код дает вам то, что вам нужно:

declare @s varchar(max), @hb varbinary(128), @h64 varchar(128); 

select @s = '2016-01-012016-12-31123456789012000EUR'; 

set @hb = hashbytes('sha2_256', @s); 
set @h64 = cast(N'' as xml).value('xs:base64Binary(sql:variable("@hb"))', 'varchar(128)'); 

select @hb as [BinaryHash], @h64 as [64Hash]; 

Помимо вышеупомянутого дополнения, есть еще один нюанс для вас искать. Убедитесь, что строка ввода всегда одного типа, то есть всегда varchar или всегда nvarchar. Если некоторые из ваших хэшей будут вычисляться из строк ASCII, а некоторые из UTF-16, результаты будут совершенно разными. В зависимости от того, какие языки используются в вашей системе, может иметь смысл всегда преобразовывать обычный текст в nvarchar перед хэшированием.

+0

Я получаю null для обоих столбцов. У меня есть MS SQL Server 2012, и когда я выполняю эти части кода, я получаю нулевое значение, потому что функция hashbytes sql поддерживает следующие алгоритмы хэша: «MD2», «MD4», «MD5», «SHA» и «SHA1». – oknevermind

+0

@knevermind, вы тестируете его на одних и тех же входных данных? Если нет, убедитесь, что ваш вход не превышает 8000 байт. –

+0

Для ввода данных я использую данные типа nvarchar. Например, я использую строку ввода 'ppp_001 # Wd !!' – oknevermind