如何在数据库中正确存储登录信息

How to properly store login info in database

我想设计一个具有以下功能的认证数据库:

  1. 我使用了 Bcrypt,所以我需要将加盐密码存储在 dB
  2. 我一次只允许用户登录一台设备,所以我需要检查用户当前是否登录。(is_logged_in)
  3. 我需要用户在将他们添加到帐户之前验证他们的 email/phone (email_verified, phone_verified)
  4. 我想存储所有用户的信息(名字、姓氏、出生日期等)
  5. 我希望用户在使用前最多创建三个安全性questions/answers
  6. 我想存储用户通过的登录信息(时间、地点等)
  7. 我想在我的多个应用程序之间共享这个数据库,即使用一个帐户登录我的多个应用程序

所以我设计了下表(主键以粗体显示):

Authentication_Info
UID | Password_salt | Is_logged_in | Email_Verified | Phone_Verified

User_Info
UID |名字 |姓 |电邮 |地点 |注册日期 |电话号码 |出生日期 |已启用

SecurityQ/A
UID | SID |安全问题 |安全答案

Passed_login_info
UID | 时间 |地点 |知识产权 |设备

将它们更改为 3NF 后,我得到了下表(同样,主键以粗体显示):

Authentication_Info
UID | Password_salt | Is_logged_in

User_Info
UID |名字 |姓 | Email_id |地点 |注册日期 | Phone_id |出生日期

SecurityQ/A
UID | SID |安全问题 |安全答案

Passed_login_info
UID | PID |时间 |地点 |知识产权 |设备

Token_Verification
Verification_id | UID |临时代币 | Expire_Time

这样的设计好吗?我犯了什么错误吗?

由于我不熟悉该应用程序的预期用途,我无法确定以下建议是否适用于这种情况,但无论如何,这里有一些建议:

  1. 关于Token_Verificationtable,我相信只需要三个字段:UIDTempTokenExpire_Time。我认为不需要 Verification_id.

  2. Authentication_Info table 不需要 Is_logged_in 的字段,因为我们可以通过搜索 UID 来检查是否已登录Token_Verification table 有效 TempToken。因此,可以删除该字段。

  3. Authentication_Infotable中的Password_salt字段应分为SaltSaltedHash_Password。当密码到达验证时,您将必须在前面加盐,散列 (salt + password) 并与存储的值进行比较。

  4. SecurityQ/A table 中,您应该将 SecurityAnswer 视为密码。每个安全答案都应与唯一的随机盐一起存储。因此,table的字段应该是UIDSIDSecurityQuestionSaltSaltedHash_SecurityAnswer

我上面没有提到的 table 对我来说还不错 :)

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