2015-07-13 3 views
1

Я работаю над реализацией хэша. Я намерен хранить соль в базе данных, в частности SQL Server. Соль будет составлять не менее 32 байт. Должна ли соль быть в шестнадцатеричной форме или я должен преобразовать ее в строку, целое число или что-то еще? Кроме того, какой тип данных я должен использовать для хранения соли: varchar, varbinary или что-то еще?Должен ли я хранить соль на SQL Server как varchar или varbinary и в шестнадцатеричном формате?

Для обеспечения безопасности это действительно не имеет значения, потому что соль не секрет. Но с точки зрения производительности и, возможно, читаемости это может быть.

спасибо.

+1

для тех, кто задается вопросом, что такое соль, http://crypto.stackexchange.com/a/2010 – Jodrell

ответ

2

Любой криптографический алогорифм, достойный его соли, (пожалуйста, извините за каламбур) будет работать над двоичными данными. Предполагая, что соли, которые вы используете, будут иметь одинаковую длину, вы должны использовать колонку 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); 
+0

Это отлично! Спасибо. – user3621633

+0

@ user3621633, я сделал преобразование 'NVARCHAR'' VARBINARY' более надежным, но, как я комментирую, лучше сделать это за пределами TSQL. – Jodrell