賬戶管理、授權(quán)和密碼管理可能對(duì)于許多開(kāi)發(fā)者來(lái)說(shuō)是一個(gè)沒(méi)有得到足夠關(guān)注的黑暗角落。以下內(nèi)容是Google與平臺(tái)總結(jié)的12條最佳實(shí)踐。
1、對(duì)密碼進(jìn)行Hash
最重要的賬戶管理規(guī)則是安全地存儲(chǔ)用戶的敏感信息,如密碼。在任何時(shí)候都不要存儲(chǔ)明文的密碼,并且存儲(chǔ)的密碼要是無(wú)法解密還原的。常用的方式是使用PBKDF2、Argon2、Scrypt或Bcrypt創(chuàng)建對(duì)密碼進(jìn)行hash。另外hash時(shí)還要進(jìn)行 加鹽 處理。千萬(wàn)不要使用已經(jīng)被棄用的hash技術(shù),如MD5、SHA1,在任何情況下都不應(yīng)使用可逆加密或 嘗試創(chuàng)建自己的散列算法 。
在設(shè)計(jì)系統(tǒng)時(shí),需要問(wèn)自己,假使數(shù)據(jù)庫(kù)泄露了,泄露后是否會(huì)對(duì)用戶使用的服務(wù)或者用戶使用的其他網(wǎng)站的服務(wù)構(gòu)成威脅,我們可以采取哪些措施來(lái)減少泄漏事件造成的損害?
2、如果可能,允許用戶使用第三方登陸
第三方登陸服務(wù)可以使您可以依賴受信任的外部服務(wù)來(lái)驗(yàn)證用戶的身份。Google,F(xiàn)acebook和Twitter是常用的提供商。您可以使用 Firebase Auth 等平臺(tái)在現(xiàn)有內(nèi)部身份驗(yàn)證系統(tǒng)旁邊實(shí)施外部身份提供程序。Firebase Auth帶來(lái)了許多好處,包括更簡(jiǎn)單的管理,更小的攻擊面和多平臺(tái)SDK。我們將在此列表中觸及更多優(yōu)勢(shì)。查看我們的 案例研究 ,了解能夠在短短一天內(nèi)集成Firebase Auth的公司。
3、將用戶身份和用戶賬戶概念分隔開(kāi)
您的用戶不是電子郵件地址。他們不是電話號(hào)碼。它們不是OAUTH響應(yīng)提供的唯一ID。您的用戶是他們?cè)谀姆?wù)中獨(dú)特,個(gè)性化數(shù)據(jù)和的體驗(yàn)。精心設(shè)計(jì)的用戶管理系統(tǒng)在用戶配置文件的不同部分之間具有低耦合和高內(nèi)聚性。保持用戶賬戶和憑證的概念分離將極大地簡(jiǎn)化實(shí)施第三方身份提供商的過(guò)程,允許用戶更改其用戶名并將多個(gè)身份鏈接到單個(gè)用戶賬戶。實(shí)際上,為每個(gè)用戶提供內(nèi)部全局標(biāo)識(shí)符并通過(guò)該ID鏈接其配置文件和身份驗(yàn)證標(biāo)識(shí)可能比將其全部存儲(chǔ)在單個(gè)記錄中更優(yōu)。
4、允許多個(gè)身份鏈接到單個(gè)用戶賬戶
如果用戶在一周前使用其 用戶名和密碼 進(jìn)行了登陸,但在這次使用了 Google登陸 ,用戶不會(huì)意識(shí)到可能會(huì)創(chuàng)建重復(fù)的賬戶。同樣,用戶可能有充分的理由將多個(gè)電子郵件地址鏈接到您的服務(wù)。如果您正確地分離了用戶身份和身份驗(yàn)證,則將 多個(gè)身份鏈接 到單個(gè)用戶將是一個(gè)簡(jiǎn)單的過(guò)程。
您的后端需要考慮用戶是否有可能在注冊(cè)過(guò)程中完成部分或全部,然后才意識(shí)到他們正在使用未鏈接到系統(tǒng)中現(xiàn)有賬戶的新第三方身份。這最簡(jiǎn)單地通過(guò)要求用戶提供公共識(shí)別細(xì)節(jié)(例如電子郵件地址,電話或用戶名)來(lái)實(shí)現(xiàn)。如果該數(shù)據(jù)與系統(tǒng)中的現(xiàn)有用戶匹配,則要求他們也使用已知身份提供商進(jìn)行身份驗(yàn)證,并將新ID鏈接到其現(xiàn)有賬戶。
5、不要阻止長(zhǎng)密碼或復(fù)雜密碼
NIST最近更新了 密碼復(fù)雜性和強(qiáng)度 指南。隨著你使用Hash算法對(duì)密碼進(jìn)行存儲(chǔ),中間的很多很多可以迎刃而解,hash算法會(huì)產(chǎn)生固定長(zhǎng)度的輸出,因此不必去限制用戶韓劇密碼的長(zhǎng)度,如果必須限制密碼長(zhǎng)度,則只能根據(jù)服務(wù)器允許的最大POST大小來(lái)設(shè)置密碼長(zhǎng)度。這通常遠(yuǎn)高于1MB。
Hash出來(lái)的密碼將由少量已知的ASCII字符組成(如果輸出為二進(jìn)制,香港免備案主機(jī) 美國(guó)服務(wù)器,則可以通過(guò) Base64 進(jìn)行轉(zhuǎn)換)??紤]到這一點(diǎn),您應(yīng)該允許您的用戶在密碼中使用他們想要的任何字符。如果有人想要一個(gè)由 Klingon 、 Emoji 和兩端都有空格的控制字符組成的密碼,你應(yīng)該沒(méi)有技術(shù)理由否認(rèn)它們。
6、不要對(duì)用戶名強(qiáng)加不合理的規(guī)則
站點(diǎn)或服務(wù)要求用戶名超過(guò)兩個(gè)或三個(gè)字符,阻止隱藏字符并阻止用戶名開(kāi)頭和結(jié)尾處的空格并不是不合理的。有些網(wǎng)站確實(shí)由這樣的要求,例如最小長(zhǎng)度為8個(gè)字符,或者阻止7位ASCII字母和數(shù)字之外的任何字符。對(duì)用戶名進(jìn)行嚴(yán)格限制的網(wǎng)站可能會(huì)為開(kāi)發(fā)人員提供一些快捷方式,但這樣做會(huì)以犧牲用戶為代價(jià),而極端情況會(huì)導(dǎo)致一些用戶離開(kāi)。
在某些情況下,只能做到分配用戶名。如果您的服務(wù)屬于這種情況,請(qǐng)確保指定的用戶名是用戶友好的,只要他們需要回憶和通信。字母數(shù)字ID應(yīng)避免使用視覺(jué)上模糊的符號(hào),例如“Il1O0”。另外建議您對(duì)任何隨機(jī)生成的字符串執(zhí)行字典掃描,以確保用戶名中沒(méi)有嵌入非預(yù)期的信息。這些相同的準(zhǔn)則適用于自動(dòng)生成的密碼。
7、允許用戶更改其用戶名
在遺留系統(tǒng)或任何提供電子郵件賬戶的平臺(tái)中,不允許用戶更改其用戶名,這種情況非常普遍。有 充分理由 不自動(dòng)釋放用戶名以供重用,但系統(tǒng)的長(zhǎng)期用戶最終會(huì)提出使用其他用戶名的充分理由,他們可能不想創(chuàng)建新賬戶。