Якщо ви додаєте значення солі до хеш-значень для чогось типу пароля, який не може бути збережений у простому тексті, яке найкраще місце для отримання значень солі? Для контексту, припустимо, це стосується паролів для входу на веб-сторінку.
Якщо ви додаєте значення солі до хеш-значень для чогось типу пароля, який не може бути збережений у простому тексті, яке найкраще місце для отримання значень солі? Для контексту, припустимо, це стосується паролів для входу на веб-сторінку.
Відповіді:
Зазвичай created TIMESTAMP
у таблиці користувачів є стовпець, щоб я міг бачити, коли користувач зареєструвався. Мені не подобається додавати додатковий стовпчик для солі, тому я використовую стовпчик мітки як сіль:
SHA1(password + created)
Це важливо?
Сіль служить двом цілям. Недоцільно використовувати великі таблиці попередньо заздалегідь заздалегідь заздалегідь заздалегідь заздалегідь заздалегідь заздалегідь заздалегідь встановлених паролів ("веселкові таблиці"), і це робить однакові паролі у списку хешей різними. Здійснення вигляду однакових паролів допомагає уникнути проблеми, коли декілька людей використовують один конкретний пароль, який, мабуть, є загальним слабким.
Тому кожен рахунок повинен мати власну унікальну сіль, і солі не повинні бути надмірно передбачуваними, в тому сенсі, що не буде групи солей, які, ймовірно, є. (Якщо багато сайтів почали з 1 і підраховували, погані хлопці могли б створити таблиці з веселок, включаючи солі з низькою кількістю.) Вони не повинні бути випадковими в будь-якому сенсі, крім загального непередбачуваного. Вони не є більш секретними, ніж сам хеш, тому їх не потрібно бути спеціально непридатними.
Використовуйте будь-який зручний метод для отримання солі. Якщо існує багато потенційних значень солі (ранні системи Unix часто використовували два байти (можливе число 65536)) порівняно з кількістю облікових записів, напіввипадкове призначення майже ніколи не видало б дублікат солі.
Кожен раз, коли ви хочете зберегти новий пароль (реєстрація, скидання пароля, оновлення пароля), одна хороша методика:
for i in (0...65536) { password = hmac(password) }
Використовуйте рамки. У .NET ви можете використовувати RNGCryptoServoiceProvider ...
// If salt is not specified, generate it on the fly.
if (saltBytes == null)
{
// Define min and max salt sizes.
int minSaltSize = 4;
int maxSaltSize = 8;
// Generate a random number for the size of the salt.
Random random = new Random();
int saltSize = random.Next(minSaltSize, maxSaltSize);
// Allocate a byte array, which will hold the salt.
saltBytes = new byte[saltSize];
// Initialize a random number generator.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
// Fill the salt with cryptographically strong byte values.
rng.GetNonZeroBytes(saltBytes);
}
Інші рамки повинні мати подібні класи, на які можна використовувати. Для досягнення випадковості програмне забезпечення часто залучає користувача в порівнянні Random
із зазначеним вище. Випадково переміщення миші в певному районі для надання солі - це варіант, який використовується TrueCrypt. Це зводиться до ваших конкретних потреб та рівня безпеки; оскільки ваша сіль може бути просто !@#$%
.
Ви створюєте сольовий сервер і призначаєте його обліковому запису користувача при його створенні. Краще використовувати API криптогенерації, доступний у вашій базі, але в принципі будь-яка послідовність буде робити.
Зазвичай речі зберігаються так:
User
-------------------
ID
Username
PasswordHashWithSalt
Приклад:
PasswordHashWithSalt =
A15CD9652D4F4A3FB61A2A422AEAFDF0DEA4E703 j5d58k4b56s8744q
Використовуйте bcrypt і читайте цю статтю, оскільки звичайний хеш поодинці не є серйозним захистом у цей день та вік.
Подумайте про використання протоколу паролів з нульовим знанням SDR, який містить безліч бібліотек з відкритими джерелами і не є патентом.
SDR вимагає солі та найкращого місця для отримання клієнта; час їх натискань клавіш, рухів миші, хеш змінних їх середовища, випадкових чисел, часів створення файлів у папці temp, щоб зробити сіль в кінці непередбачуваним способом подалі від вашого сервера. SDR приймає сіль, великий прайм, пароль користувача та генерує ключ перевірки. Ви не зберігаєте пароль, він ніколи не залишає їх машину, але ви можете переконатися, що у них є пароль, який входить із ключем перевірки та сіллю. Він захищений від людини в середині та словникових атак. Зашифруйте ключі та сіль у стовпці бази даних, щоб бути впевненим.