Любой криптографический алогорифм, достойный его соли, (пожалуйста, извините за каламбур) будет работать над двоичными данными. Предполагая, что соли, которые вы используете, будут иметь одинаковую длину, вы должны использовать колонку BINARY
, если соли имеют переменную длину, используют VARBINARY
.
Соль должна быть случайной или псевдослучайной последовательностью байтов. Он должен отличаться для каждого значения, которое вы хешируете, но может быть сохранено в ясности.
Код, подобный этому, придаст нужные значения.
-- obviously, don't store a password in code,
-- this is here to enable subsequent calls.
DECLARE @password NVARCHAR(MAX) = N'Whatever';
---
DECLARE @salt BINARY(64) = CRYPT_GEN_RANDOM(64);
-- There is a limit of 4000 bytes for HASHBYTES so in case the password
-- very long, truncate to 3936 bytes. If you can I'd convert the password
-- to binary before passing to SQL server.
DECLARE @passwordBytes VARBINARY(3936);
SELECT
@passwordBytes = @passwordBytes +
CONVERT(BINARY(2), UNICODE(SUBSTRING([A].[B], [V].[number] + 1, 1)))
FROM
(SELECT CAST(@password NVARCHAR(1968)) [B]) [A]
JOIN
[master].[dbo].[spt_values] [V]
ON [V].[number] < LEN([A].[B])
WHERE
[V].[type] = 'P';
DECLARE @hash BINARY(64) = HASHBYTES('SHA2_512', @passwordBytes + @salt);
для тех, кто задается вопросом, что такое соль, http://crypto.stackexchange.com/a/2010 – Jodrell