Как правильно хранить информацию для входа в базу данных - PullRequest
0 голосов
/ 22 сентября 2018

Я хочу создать аутентификационную базу данных, которая имеет следующие функции:

  1. Я использовал Bcrypt, поэтому мне нужно хранить соленый пароль в дБ
  2. Я разрешаю только логин пользователяна одно устройство за раз, поэтому мне нужно проверить, вошел ли пользователь в данный момент. (is_logged_in)
  3. Мне нужно, чтобы пользователи подтвердили свой адрес электронной почты / телефон перед добавлением их в учетную запись (email_verified, phone_verified)
  4. Я хочу сохранить всю информацию о пользователе (firstName, lastName, dateOfBirth и т.хочу сохранить информацию о пользователях, прошедших вход (время, местоположение и т. д.)
  5. Я хочу поделиться этой базой данных между несколькими приложениями, т.е. использовать одну учетную запись для входа в несколько приложений

Итак, я разработал следующие таблицы (основной ключ выделен жирным шрифтом):

Authentication_Info
UID |Пароль_соль |Is_logged_in |Email_Verified |Phone_Verified

User_Info
UID |FirstName |Фамилия |Email |Расположение |RegisterDate |PhoneNumber |DateOfBirth |isEnabled

SecurityQ / A
UID | SID |SecurityQuestion |SecurityAnswer

Passed_login_info
UID | Время |Расположение |IP |Устройство

После того, как я изменил их на 3NF, я получил следующие таблицы (опять же, основной ключ выделен жирным шрифтом):

Authentication_Info
UID |Пароль_соль |Is_logged_in

User_Info
UID |FirstName |Фамилия |Email_id |Расположение |RegisterDate |Phone_id |DateOfBirth

SecurityQ / A
UID | SID |SecurityQuestion |SecurityAnswer

Passed_login_info
UID | PID |Время |Расположение |IP |Устройство

Token_Verification
Verification_id | UID |TempToken |Expire_Time

Это хороший дизайн?Какие ошибки я сделал?

1 Ответ

0 голосов
/ 24 сентября 2018

Поскольку я не знаком с предполагаемым использованием приложения, я не могу с уверенностью сказать, применим ли приведенный ниже совет в данной ситуации, но, тем не менее, вот несколько предложений:

  1. Что касается таблицы Token_Verification, я считаю, что необходимо заполнить только три поля: UID, TempToken, Expire_Time.Я не вижу необходимости в Verification_id.

  2. Таблица Authentication_Info не нуждается в поле для Is_logged_in, потому что мы можем проверить, зарегистрировано ли UIDпутем поиска в таблице Token_Verification допустимого значения TempToken.Таким образом, это поле можно удалить.

  3. Поле Password_salt в таблице Authentication_Info следует разделить на Salt и SaltedHash_Password.Когда приходит пароль для проверки, вам нужно будет добавить соль, хэшировать (salt + password) и сравнить с сохраненным значением.

  4. В таблице SecurityQ/A вы должны обработать SecurityAnswer как если бы это был пароль.Каждый защитный ответ должен храниться с уникальной случайной солью.Таким образом, поля таблицы должны быть UID, SID, SecurityQuestion, Salt, SaltedHash_SecurityAnswer.

Таблицы, которые я не упомянул выше, выглядят хорошо для меня:)

       (\(\
       ).. \
       \Y_, '-.
         )     '.
         |  \/   \ 
         \\ |\_  |_
         ((_/(__/_,'.
              (,----'
...