繁体   English   中英

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

[英]How to properly store login info in database

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

  1. 我使用了Bcrypt,所以我需要将盐化密码存储在dB中
  2. 我一次只允许用户登录到一台设备,因此我需要检查用户当前是否登录。(is_logged_in)
  3. 我需要用户先验证其电子邮件/电话,然后再将其添加到帐户(email_verified,phone_verified)
  4. 我想存储所有用户的信息(名字,姓氏,dateOfBirth等)
  5. 我希望用户在使用前最多创建三个安全问题/答案
  6. 我想存储用户传递的登录信息(时间,位置等)
  7. 我想在多个应用程序之间共享该数据库,即使用一个帐户登录多个应用程序

因此,我设计了以下表格(主键以粗体显示):

认证信息
UID | 密码盐| Is_logged_in | 电子邮件已验证| 电话验证

用户信息
UID | 名| 姓氏| 电邮| 位置| 注册日期| 电话号码| 出生日期| isEnabled

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

Passed_login_info
UID | 时间 | 位置| IP | 设备

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

认证信息
UID | 密码盐| Is_logged_in

用户信息
UID | 名| 姓氏| Email_id | 位置| 注册日期| Phone_id | 出生日期

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

Passed_login_info
UID | PID | 时间| 位置| IP | 设备

令牌验证
Verification_id | UID | TempToken | Expire_Time

这是一个好的设计吗? 我有任何错误吗?

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

  1. 关于Token_Verification表,我相信只需要三个字段: UIDTempTokenExpire_Time 我看不到需要Verification_id

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

  3. Authentication_Info表中的Password_salt字段应分为SaltSaltedHash_Password 当密码到达验证时,您将必须加盐,对(salt + password)进行哈希处理,然后与存储的值进行比较。

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

我上面没有提到的表对我来说很好:)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM