簡體   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