如何在数据库中正确存储登录信息
How to properly store login info in database
我想设计一个具有以下功能的认证数据库:
- 我使用了 Bcrypt,所以我需要将加盐密码存储在 dB
- 我一次只允许用户登录一台设备,所以我需要检查用户当前是否登录。(is_logged_in)
- 我需要用户在将他们添加到帐户之前验证他们的 email/phone (email_verified, phone_verified)
- 我想存储所有用户的信息(名字、姓氏、出生日期等)
- 我希望用户在使用前最多创建三个安全性questions/answers
- 我想存储用户通过的登录信息(时间、地点等)
- 我想在我的多个应用程序之间共享这个数据库,即使用一个帐户登录我的多个应用程序
所以我设计了下表(主键以粗体显示):
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
这样的设计好吗?我犯了什么错误吗?
由于我不熟悉该应用程序的预期用途,我无法确定以下建议是否适用于这种情况,但无论如何,这里有一些建议:
关于Token_Verification
table,我相信只需要三个字段:UID
、TempToken
、Expire_Time
。我认为不需要 Verification_id
.
Authentication_Info
table 不需要 Is_logged_in
的字段,因为我们可以通过搜索 UID
来检查是否已登录Token_Verification
table 有效 TempToken
。因此,可以删除该字段。
Authentication_Info
table中的Password_salt
字段应分为Salt
和SaltedHash_Password
。当密码到达验证时,您将必须在前面加盐,散列 (salt + password)
并与存储的值进行比较。
在 SecurityQ/A
table 中,您应该将 SecurityAnswer
视为密码。每个安全答案都应与唯一的随机盐一起存储。因此,table的字段应该是UID
、SID
、SecurityQuestion
、Salt
、SaltedHash_SecurityAnswer
。
我上面没有提到的 table 对我来说还不错 :)
(\(\
).. \
\Y_, '-.
) '.
| \/ \
\ |\_ |_
((_/(__/_,'.
(,----'
我想设计一个具有以下功能的认证数据库:
- 我使用了 Bcrypt,所以我需要将加盐密码存储在 dB
- 我一次只允许用户登录一台设备,所以我需要检查用户当前是否登录。(is_logged_in)
- 我需要用户在将他们添加到帐户之前验证他们的 email/phone (email_verified, phone_verified)
- 我想存储所有用户的信息(名字、姓氏、出生日期等)
- 我希望用户在使用前最多创建三个安全性questions/answers
- 我想存储用户通过的登录信息(时间、地点等)
- 我想在我的多个应用程序之间共享这个数据库,即使用一个帐户登录我的多个应用程序
所以我设计了下表(主键以粗体显示):
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
这样的设计好吗?我犯了什么错误吗?
由于我不熟悉该应用程序的预期用途,我无法确定以下建议是否适用于这种情况,但无论如何,这里有一些建议:
关于
Token_Verification
table,我相信只需要三个字段:UID
、TempToken
、Expire_Time
。我认为不需要Verification_id
.Authentication_Info
table 不需要Is_logged_in
的字段,因为我们可以通过搜索UID
来检查是否已登录Token_Verification
table 有效TempToken
。因此,可以删除该字段。Authentication_Info
table中的Password_salt
字段应分为Salt
和SaltedHash_Password
。当密码到达验证时,您将必须在前面加盐,散列(salt + password)
并与存储的值进行比较。在
SecurityQ/A
table 中,您应该将SecurityAnswer
视为密码。每个安全答案都应与唯一的随机盐一起存储。因此,table的字段应该是UID
、SID
、SecurityQuestion
、Salt
、SaltedHash_SecurityAnswer
。
我上面没有提到的 table 对我来说还不错 :)
(\(\
).. \
\Y_, '-.
) '.
| \/ \
\ |\_ |_
((_/(__/_,'.
(,----'