3-я обычная форма для таблицы учетных записей пользователей, солей и хэшей
Я понимаю важность солей, хэшей и всего такого хорошего для паролей. Мой вопрос относится к теории реляционных баз данных.
Мое понимание третьей нормальной формы заключается в том, что каждый элемент должен предоставлять факт о ключе, целом ключе и ничего, кроме ключа (так что помогите мне Codd. Спасибо Википедия). Итак, я просматривал некоторые из своих таблиц и наткнулся на это.
-- Users
CREATE TABLE accounts(
player_id mediumint NOT NULL AUTO_INCREMENT, -- Surrogate Key
username VARCHAR(32) UNIQUE NOT NULL, -- True primary key
salt char(29), -- Passwords are stored in bcrypt hash
hash char(60), -- Salt + Hash stored
created DATETIME,
lastlogin DATETIME,
PRIMARY KEY (player_id)
) ENGINE = InnoDB;
Вопрос: эта таблица в 3-й нормальной форме? Насколько я понимаю... "Hash" зависит от player_id и соли. IE: hash -> (имя пользователя, соль).
Я просто не вижу никакой реальной пользы в разделении этой таблицы. Но я волнуюсь, что есть возможная аномалия обновления или что-то, чего я не вижу.
3 ответа
"Хеш" зависит от player_id и соли. IE: hash -> (имя пользователя, соль).
Это странно.
Обычно хеш получается из соли и пароля.
В этом случае хеш предоставляет дополнительную и важную информацию о конкретном пользователе, поскольку сам пароль нигде не хранится. Если вы сохранили как хеш, так и пароль, хеш будет функционально зависеть от комбинации пароля и соли (и, возможно, имени пользователя). Хранение хеша и пароля, таким образом, нарушит 3NF и всю цель использования хеша.
Должно быть невозможно вычислить хеш из любой другой информации в вашей базе данных без дополнительного ввода пароля (нигде не хранится). В противном случае хеш будет довольно бесполезным. И поскольку это так, хеш-столбец функционально не зависит от каких-либо других данных в БД, и таблица соответствует 3NF.
Если ваш хэш не имеет ничего общего с паролем, т.е. может быть рассчитан из других столбцов, то да, вам не нужно хранить его в БД.
Пожалуйста, не разбивайте стол. Эта таблица в 3-й нормальной форме. Насколько я вижу, все столбцы зависят от player_id, с оговоркой, что соль зависит, например, от имени пользователя или player_id.