App登錄常見(jiàn)的安全點(diǎn):
1.密碼的安全
2.token值安全使用
密碼存儲(chǔ)
用戶密碼必須不能明文存儲(chǔ)。如果數(shù)據(jù)庫(kù)泄露津滞,那么所有用戶的密碼就會(huì)被泄露耕陷,存在非常高的安全風(fēng)險(xiǎn)。
用戶密碼不能直接hash存儲(chǔ)据沈。hash破解現(xiàn)在已經(jīng)不是一件難事哟沫,方法有查表法、反向查表法锌介、彩虹表等嗜诀。
在存儲(chǔ)用戶密碼的時(shí)候,一定要考慮的是加鹽hash孔祸。所謂 鹽(salt) 實(shí)際是一個(gè)隨機(jī)字符串隆敢,在用戶密碼的前面或者后面加一個(gè)隨機(jī)字符串,然后再hash崔慧,即使hash被破解拂蝎,也能保證用戶密碼不丟失。
加鹽hash需要一些基本原則:
鹽值永遠(yuǎn)不要重復(fù)使用惶室;
每個(gè)用戶的每一個(gè)密碼都要使用獨(dú)一無(wú)二的鹽值温自;
用戶每次創(chuàng)建帳號(hào)或更改密碼時(shí),密碼應(yīng)采用一個(gè)新的隨機(jī)鹽值;
鹽值需要單獨(dú)存儲(chǔ)皇钞,或者固定鹽值長(zhǎng)度悼泌,然后固定放在 hash結(jié)果 的某個(gè)位置鹽值不要太短,建議32位以上;
MD5 夹界、SHA1馆里、SHA256、SHA512可柿、RipeMD鸠踪、WHIRLPOOL、SHA3等hash算法复斥,都屬于快速加密hash函數(shù)营密,他們的弱點(diǎn)在于,加密快永票,破解也快卵贱。建議使用 慢哈希函數(shù) 進(jìn)行hash處理滥沫,如 PBKDF2 或 bcrypt的安全版本侣集。 慢哈希函數(shù) 在hash的計(jì)算過(guò)程中键俱,也會(huì)變慢,但是這個(gè)速度是可以根據(jù)參數(shù)調(diào)整的世分,建議慢hash時(shí)間調(diào)整到200ms-500ms编振,如果速度過(guò)慢,容易讓系統(tǒng)遭受ddos攻擊臭埋。到這一步踪央,系統(tǒng)還不是完全的安全。如果我們采用加密算法瓢阴,比如 AES對(duì)稱加密畅蹂,對(duì)hash結(jié)果進(jìn)行加密,那么只有知道秘鑰的人才能解密出hash結(jié)果荣恐,然后才有機(jī)會(huì)對(duì)hash破解液斜。
密碼的傳輸
用戶在注冊(cè)或者登陸時(shí),需要將密碼傳遞到服務(wù)端叠穆。但是要嚴(yán)禁明文傳輸密碼少漆。
建議的一種方案是,MD5算法對(duì)密碼進(jìn)行加密傳輸:
public class MD5Utils {
public static String md5(String plainText) {
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("加密失敗");
}
return new BigInteger(1, secretBytes).toString(16);
}
}
根據(jù)MD5的特點(diǎn):不可逆,唯一性的特點(diǎn),這種將MD5值作為密碼使用的好處是:前端用戶設(shè)置的密碼,只有用戶本人知道,即是密碼攔截掉,無(wú)法破解真正的密碼(MD5不可逆),從而從源頭保證密碼的安全性.
提示語(yǔ)方面
不要刻意的告訴用戶輸錯(cuò)的究竟是用戶名還是密碼硼被。
防止攔截?cái)?shù)據(jù)測(cè)試;
典型的提示一般:“你輸入的用戶名或密碼不正確”示损。
token值得使用原理:
Token原理:服務(wù)器端在處理到達(dá)的請(qǐng)求之前,會(huì)將請(qǐng)求中包含的令牌值與保存在當(dāng)前用戶會(huì)話中的令牌值進(jìn)行比較嚷硫,看是否匹配检访。在處理完該請(qǐng)求后,且在答復(fù)發(fā)送給客戶端之前仔掸,將會(huì)產(chǎn)生一個(gè)新的令牌烛谊,該令牌除傳給客戶端以外,也會(huì)將用戶會(huì)話中保存的舊的令牌進(jìn)行替換嘉汰。這樣如果用戶回退到剛才的提交頁(yè)面并再次提交的話丹禀,客戶端傳過(guò)來(lái)的令牌就和服務(wù)器端的令牌不一致,從而有效地防止了重復(fù)提交的發(fā)生.
其實(shí)token就是一個(gè)令牌鞋怀,用來(lái)判斷身份的双泪。
首先服務(wù)器創(chuàng)建一個(gè)token傳到客戶端,客戶端每次請(qǐng)求密似,都把token傳給服務(wù)器驗(yàn)證身份焙矛。
將id加密為token,然后把token解密為id