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.

Другие вопросы по тегам