簡體   English   中英

將哈希密碼存儲到Mysql

[英]store hashed passwords to Mysql

我正在研究關於將密碼散列並將密碼存儲到PHP.NET上的數據庫。 該網站說:

例如,如果要將數據存儲在MySQL數據庫中,請記住varchar字段會在插入過程中自動刪除尾隨空格。 由於加密數據可以以空格(ASCII 32)結尾,因此刪除將損壞數據。 而是將數據存儲在tinyblob / tinytext(或更大)字段中。

這建議哪個更好? 還是我不得不問:其中一個更好嗎? 如果答案是肯定的,那是什么? 最后,我該如何使用PDO將密碼存儲到數據庫。 我以為我可以像文件一樣將信息寫入blob行,但是如果我從輸入中獲取值,則必須使用哪種方法或函數? 你能解釋一下嗎?

當存儲哈希密碼時,則不會出現空格刪除問題:

  • 您永遠不會自己存儲密碼,而是存儲哈希函數。
  • 該哈希函數產生固定大小的輸出(或者您可能使用可逆加密算法)。
  • 大多數哈希函數的輸出已經是固定大小的純文本[1] ,其中不包含任何空格。 否則,您可能正在使用不用於密碼哈希的哈希函數。
  • 固定大小的與哈希輸出一起存儲(知道鹽分的密碼哈希函數通常使用哈希密碼輸出鹽)。
  • 如果您想變得靈活並且將來能夠升級到更好的哈希函數,則還必須記住使用了哪個哈希函數。 建議對此信息使用純文本[1] ,這會使完整記錄變長。 RFC 2307描述了這種可能的明文[1]存儲方案。

密碼應使用經過驗證的現代密鑰擴展算法進行哈希處理,但不能使用SHA-256或MD5等加密哈希函數進行哈希處理。 合適的算法包括PBKDF2bcryptscrypt

例如,用bcrypt哈希字符串“密碼”並生成新的鹽可能會產生

$2a$12$PuYHvYwgKeD.hQ1Dv6nLQuxUkv5zP3lYLPHqdMOzgwPVaGGSAs07u
`-----'`-----------·······                  ·········-------'
algorithm       random salt                    password hash
parameters

整個字符串都可以用作鹽,因為實際的密碼哈希將被截斷而不用作鹽。

驗證登錄嘗試的推薦工作流程:

  1. 用戶提供用戶名和密碼。 小心處理Unicode規范化和編碼。
  2. 哈希密碼是根據用戶名從數據庫中獲取的。
  3. 解析哈希密碼以確定使用的算法。
  4. 以用戶密碼作為輸入,以哈希密碼作為salt來調用正確的算法。
  5. 如果兩個哈希值匹配,則用戶提供了正確的密碼。

推薦的設置新密碼的工作流程:

  1. 如果用戶已經存在,請對其進行身份驗證。
  2. 從用戶處獲取新密碼。 注意處理Unicode規范化和編碼。 向用戶提供有關其密碼強度的反饋(但不要讓愚蠢的要求(例如禁止使用的字符或限制的最大長度)使用戶感到沮喪)。
  3. 創建一個新的鹽,該鹽不能取決於密碼或用戶名之類的用戶輸入。
  4. 選擇一個強大的密碼哈希功能,然后用新的salt哈希密碼。
  5. 更新數據庫以存儲新密碼以及哈希函數的標識符。

進一步的評論:

  • 加密的數據是二進制數據,不應存儲為文本(請使用Blob)。
  • 哈希通常通常表示為純文本而不是二進制數據,因為文本更易於存儲。
  • 在許多情況下,您可以使用OpenID代替實現自己的身份驗證。 例如,Stack Exchange提供使用OpenID登錄。 因為我使用此選項,所以我不必透露SE的密碼。
  • 我沒有加密背景。 了解更多信息的人經常光顧信息安全

[1]此處,“純文本”表示可打印的ASCII字符。 它不參考密碼的明文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM