首页 > 解决方案 > 如何在数据库中正确存储登录信息

问题描述

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

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

所以我设计了以下表格(主键为粗体):

Authentication_Info
UID | 密码_盐 | Is_logged_in | 电子邮件_已验证 | 电话_已验证


用户信息UID | 名字 | 姓氏 | 电子邮件 | 位置 | 注册日期 | 电话号码 | 出生日期 | 已启用

安全Q/A
UID | 西德| 安全问题 | 安全答案

Passed_login_info
UID | 时间 | 位置 | 知识产权 | 设备

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

Authentication_Info
UID | 密码_盐 | is_logged_in


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

安全Q/A
UID | 西德| 安全问题 | 安全答案

Passed_login_info
UID | PID | 时间 | 位置 | 知识产权 | 设备

Token_Verification
验证_id | 识别码| 临时令牌 | 过期时间

这是一个好的设计吗?我犯了什么错误?

标签: databasedatabase-designdatabase-security

解决方案


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

  1. 关于Token_Verification表格,我相信只需要三个字段:UID, TempToken, Expire_Time。我认为没有必要Verification_id

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

  3. 表中的Password_salt字段Authentication_Info应分隔为SaltSaltedHash_Password。当密码到达进行验证时,您必须预先添加盐,散列(salt + password)并与存储的值进行比较。

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

我上面没有提到的表格对我来说看起来不错:)

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

推荐阅读