database - 如何在数据库中正确存储登录信息
问题描述
我想设计一个具有以下功能的身份验证数据库:
- 我使用了 Bcrypt,所以我需要将加盐密码存储在 dB 中
- 我一次只允许用户登录一台设备,所以我需要检查用户当前是否登录。(is_logged_in)
- 我需要用户在将他们添加到帐户之前验证他们的电子邮件/电话(email_verified,phone_verified)
- 我想存储所有用户的信息(名字、姓氏、出生日期等)
- 我希望用户在使用之前最多创建三个安全问题/答案
- 我想存储用户传递的登录信息(时间、位置等)
- 我想在我的多个应用程序之间共享这个数据库,即使用一个帐户登录我的多个应用程序
所以我设计了以下表格(主键为粗体):
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 | 识别码| 临时令牌 | 过期时间
这是一个好的设计吗?我犯了什么错误?
解决方案
由于我不熟悉该应用程序的预期用途,我无法确定以下建议是否适用于这种情况,但无论如何,这里有一些建议:
关于
Token_Verification
表格,我相信只需要三个字段:UID
,TempToken
,Expire_Time
。我认为没有必要Verification_id
。该
Authentication_Info
表不需要字段,Is_logged_in
因为我们可以通过在表UID
中搜索有效的 来检查 a 是否已登录。因此,可以删除该字段。Token_Verification
TempToken
表中的
Password_salt
字段Authentication_Info
应分隔为Salt
和SaltedHash_Password
。当密码到达进行验证时,您必须预先添加盐,散列(salt + password)
并与存储的值进行比较。在
SecurityQ/A
表中,您应该将SecurityAnswer
其视为密码。每个安全答案都应与唯一的随机盐一起存储。因此,表的字段应该是UID
,SID
,SecurityQuestion
,Salt
,SaltedHash_SecurityAnswer
。
我上面没有提到的表格对我来说看起来不错:)
(\(\
).. \
\Y_, '-.
) '.
| \/ \
\\ |\_ |_
((_/(__/_,'.
(,----'
推荐阅读
- unicode - 如何将包含的 UTF-8 二进制文件的错误 unicode 转换为 str?
- c# - 单独类中的 DelegateCommand 第一次调用 CanExecute 参数为空
- angular - 在 Angular 中对列表组件进行排序
- c# - WPF 与 SciChart 在单独的 AppDomain 中
- c++ - 如何解决“向量下标超出范围”错误?
- javascript - Sequelize.js 设置器功能无法按预期工作
- php - 使用 PHP 和 MYSQL 将 last_insert_id() 插入到不同的表中时的不同 ID
- pyspark - 火花“java.io.IOException:设备上没有剩余空间”
- java - 如何使用 codemodel 使用父类的任何字段
- vue.js - Nuxt/Vue:如果单击嵌套的 nuxt-link,则单击父级忽略