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

时间:2018-09-22 20:15:50

标签: database database-design database-security

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

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

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

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

User_Info
UID |名|姓氏|电邮|位置|注册日期|电话号码|出生日期| isEnabled

SecurityQ / A
UID | SID |安全问题| SecurityAnswer

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

将它们更改为3NF后,得到以下表格(再次,主键为粗体):

Authentication_Info
UID |密码盐| Is_logged_in

User_Info
UID |名|姓氏| Email_id |位置|注册日期| Phone_id |出生日期

SecurityQ / A
UID | SID |安全问题| SecurityAnswer

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

令牌验证
Verification_id | UID | TempToken | Expire_Time

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

  4. SecurityAnswer表中,应将UID视为密码。每个安全性答案应与唯一的随机盐一起存储。因此,表的字段应为SIDSecurityQuestionSaltSaltedHash_SecurityAnswer (\(\ ).. \ \Y_, '-. ) '. | \/ \ \\ |\_ |_ ((_/(__/_,'. (,----'

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

reflect.Value