一绳泉、登錄機(jī)制
粗略地分析姆泻, 登錄機(jī)制主要分為登錄驗(yàn)證拇勃、登錄保持潜秋、登出三個(gè)部分。登錄驗(yàn)證是指客戶端提供用戶名和密碼罗售,向服務(wù)器提出登錄請求,服務(wù)器判斷客戶端是否可以登錄并向客戶端確認(rèn)穆碎。 登錄認(rèn)保持是指客戶端登錄后所禀, 服務(wù)器能夠分辨出已登錄的客戶端放钦,并為其持續(xù)提供登錄權(quán)限的服務(wù)器操禀。登出是指客戶端主動退出登錄狀態(tài)。容易想到的方案是斤寂,客戶端登錄成功后遍搞, 服務(wù)器為其分配sessionId, 客戶端隨后每次請求資源時(shí)都帶上sessionId器腋。
1.1 登錄驗(yàn)證
上述簡易的登錄驗(yàn)證策略存在明顯的安全漏洞,需要優(yōu)化蒂培。
1.1.1 密碼的傳輸
客戶端第一次發(fā)出登錄請求時(shí)护戳, 用戶密碼以明文的方式傳輸, 一旦被截獲抗悍, 后果嚴(yán)重钳枕。因此密碼需要加密鱼炒,例如可采用RSA非對稱加密指蚁。具體流程如下:
- 客戶端向服務(wù)器第一次發(fā)起登錄請求(不傳輸用戶名和密碼)凝化。
- 服務(wù)器利用RSA算法產(chǎn)生一對公鑰和私鑰。并保留私鑰瞧哟, 將公鑰發(fā)送給客戶端。
- 客戶端收到公鑰后遣疯, 加密用戶密碼缠犀, 向服務(wù)器發(fā)起第二次登錄請求(傳輸用戶名和加密后的密碼)辨液。
- 服務(wù)器利用保留的私鑰對密文進(jìn)行解密箱残,得到真正的密碼被辑。
1.1.2 登錄狀態(tài)token
再仔細(xì)核對上述登錄流程, 我們發(fā)現(xiàn)服務(wù)器判斷用戶是否登錄谈山, 完全依賴于sessionId, 一旦其被截獲奏路, 黑客就能夠模擬出用戶的請求鸽粉。于是我們需要引入token的概念: 用戶登錄成功后抓艳, 服務(wù)器不但為其分配了sessionId, 還分配了token, token是維持登錄狀態(tài)的關(guān)鍵秘密數(shù)據(jù)儡首。在服務(wù)器向客戶端發(fā)送的token數(shù)據(jù)椒舵,也需要加密笔宿。于是一次登錄的細(xì)節(jié)再次擴(kuò)展。
- 客戶端向服務(wù)器第一次發(fā)起登錄請求(不傳輸用戶名和密碼)涝动。
- 服務(wù)器利用RSA算法產(chǎn)生一對公鑰和私鑰醋粟。并保留私鑰重归, 將公鑰發(fā)送給客戶端鼻吮。
- 客戶端收到公鑰后椎木, 加密用戶密碼,向服務(wù)器發(fā)送用戶名和加密后的用戶密碼漱竖; 同時(shí)另外產(chǎn)生一對公鑰和私鑰馍惹,自己保留私鑰, 向服務(wù)器發(fā)送公鑰烤礁; 于是第二次登錄請求傳輸了用戶名和加密后的密碼以及客戶端生成的公鑰脚仔。
- 服務(wù)器利用保留的私鑰對密文進(jìn)行解密,得到真正的密碼们颜。 經(jīng)過判斷窥突, 確定用戶可以登錄后阻问,生成sessionId和token, 同時(shí)利用客戶端發(fā)送的公鑰,對token進(jìn)行加密凳谦。最后將sessionId和加密后的token返還給客戶端衡未。
- 客戶端利用自己生成的私鑰對token密文解密缓醋, 得到真正的token改衩。
1.2 登錄保持
在最原始的方案中葫督, 登錄保持僅僅靠服務(wù)器生成的sessionId: 客戶端的請求中帶上sessionId, 如果服務(wù)器的redis中存在這個(gè)id橄镜,就認(rèn)為請求來自相應(yīng)的登錄客戶端冯乘。 但是只要sessionId被截獲裆馒, 請求就可以為偽造, 存在安全隱患翔横。
引入token后禾唁,上述問題便可得到解決丐枉。 服務(wù)器將token和其它的一些變量瘦锹, 利用散列加密算法得到簽名后弯院,連同sessionId一并發(fā)送給服務(wù)器; 服務(wù)器取出保存于服務(wù)器端的token,利用相同的法則生成校驗(yàn)簽名锭沟, 如果客戶端簽名與服務(wù)器的校驗(yàn)簽名一致抽兆, 就認(rèn)為請求來自登錄的客戶端
1.3 TOKEN失效
用戶登錄出系統(tǒng)
失效原理:
在服務(wù)器端的redis中刪除相應(yīng)key為session的鍵值對。
二族淮、 散列算法
散列是信息的提煉辫红,通常其長度要比信息小得多,且為一個(gè)固定長度祝辣。加密性強(qiáng)的散列一定是不可逆的贴妻,這就意味著通過散列結(jié)果,無法推出任何部分的原始信息蝙斜。任何輸入信息的變化,哪怕僅一位孕荠,都將導(dǎo)致散列結(jié)果的明顯變化娩鹉,這稱之為雪崩效應(yīng)。散列還應(yīng)該是防沖突的稚伍,即找不出具有相同散列結(jié)果的兩條信息弯予。具有這些特性的散列結(jié)果就可以用于驗(yàn)證信息是否被修改。
散列算法可以用來加密token生成簽名个曙, 以便token信息不暴露在網(wǎng)絡(luò)同時(shí)還能驗(yàn)證登錄的有效性锈嫩。
2.1 md5
全寫: Message Digest Algorithm MD5(中文名為消息摘要算法第五版)
輸出: 128bit
MD5算法具有以下特點(diǎn):
1、壓縮性:任意長度的數(shù)據(jù)垦搬,算出的MD5值長度都是固定的呼寸。
2、容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易猴贰。
3对雪、抗修改性:對原數(shù)據(jù)進(jìn)行任何改動,哪怕只修改1個(gè)字節(jié)糟趾,所得到的MD5值都有很大區(qū)別慌植。
4甚牲、弱抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的蝶柿。
5丈钙、強(qiáng)抗碰撞:想找到兩個(gè)不同的數(shù)據(jù),使它們具有相同的MD5值交汤,是非常困難的雏赦。
缺陷:
Md5一度被認(rèn)為十分靠譜。
2004年8月17日的美國加州圣巴巴拉的國際密碼學(xué)會議(Crypto’2004)上芙扎,來自中國山東大學(xué)的王小云教授做了破譯MD5星岗、HAVAL-128、 MD4和RIPEMD算法的報(bào)告戒洼,公布了MD系列算法的破解結(jié)果俏橘。
2009年,馮登國圈浇、謝濤二人利用差分攻擊寥掐,將MD5的碰撞算法復(fù)雜度從王小云的 242 進(jìn)一步降低到 221,極端情況下甚至可以降低至210磷蜀。僅僅221的復(fù)雜度意味著即便是在2008年的計(jì)算機(jī)上召耘,也只要幾秒便可以找到一對碰撞。
Md5已老褐隆, 在安全性要求較高的場合污它,不建議使用。
2.2 sha1
全名: 安全哈希算法(Secure Hash Algorithm)
輸出: 160bit
2.2.1 與Md5比較
相同點(diǎn):
因?yàn)槎呔蒑D4導(dǎo)出庶弃,SHA-1和MD5彼此很相似衫贬。相應(yīng)的,他們的強(qiáng)度和其他特性也是相似歇攻。
不同點(diǎn):
- 對強(qiáng)行攻擊的安全性:最顯著和最重要的區(qū)別是SHA-1摘要比MD5摘要長32 位祥山。使用強(qiáng)行技術(shù),產(chǎn)生任何一個(gè)報(bào)文使其摘要等于給定報(bào)摘要的難度對MD5是2128數(shù)量級的操作掉伏,而對SHA-1則是2160數(shù)量級的操作。這樣澳窑,SHA-1對強(qiáng)行攻擊有更大的強(qiáng)度斧散。
- 對密碼分析的安全性:由于MD5的設(shè)計(jì),易受密碼分析的攻擊摊聋,SHA-1顯得不易受這樣的攻擊鸡捐。
- 速度:在相同的硬件上登刺,SHA-1的運(yùn)行速度比MD5慢搞疗。
2.3 加鹽
所謂加鹽撕彤, 就是在原本需要加密的信息基礎(chǔ)上渔欢,糅入其它內(nèi)容salt。簽名的生成就是一次加鹽色迂。
三香缺、對稱加密
本系統(tǒng)使用對稱加密對用戶密碼進(jìn)行加密以及生成token字符串。
3.1 AuthCode加密
AuthCode是康盛科技發(fā)明的加密方式歇僧, 開源產(chǎn)品Discuz的密碼是用這個(gè)算法進(jìn)行加密图张。但是有點(diǎn)遺憾,這個(gè)函數(shù)所有權(quán)屬于康盛創(chuàng)想诈悍,并不能自由使用的祸轮。不知使用是否有風(fēng)險(xiǎn)?侥钳?
3.2 AES加密
高級加密標(biāo)準(zhǔn)(英語:Advanced Encryption Standard适袜,縮寫:AES),在密碼學(xué)中又稱Rijndael加密法舷夺,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)苦酱。這個(gè)標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用冕房。
四躏啰、非對稱加密
RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊耙册,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)给僵。RSA的安全基于大數(shù)分解的難度。其公鑰和私鑰是一對大素?cái)?shù)(100到200位十進(jìn)制數(shù)或更大)的函數(shù)详拙。從一個(gè)公鑰和密文恢復(fù)出明文的難度帝际,等價(jià)于分解兩個(gè)大素?cái)?shù)之積(這是公認(rèn)的數(shù)學(xué)難題)。
算法描述:
(1)選擇一對不同的饶辙、足夠大的素?cái)?shù)p蹲诀,q。
(2)計(jì)算n=pq弃揽。
(3)計(jì)算f(n)=(p-1)(q-1)脯爪,同時(shí)對p, q嚴(yán)加保密,不讓任何人知道矿微。
(4)找一個(gè)與f(n)互質(zhì)的數(shù)e(公鑰指數(shù))痕慢,且1<e<f(n)。
(5)計(jì)算d(私鑰指數(shù))涌矢,使得de≡1 mod f(n)掖举。這個(gè)公式也可以表達(dá)為d ≡e-1 mod f(n)
注,≡是數(shù)論中表示同余的符號娜庇。
(6)公鑰KU=(e,n)塔次,私鑰KR=(d,n)方篮。
(7)加密時(shí),先將明文變換成0至n-1的一個(gè)整數(shù)M励负。若明文較長藕溅,可先分割成適當(dāng)?shù)慕M,然后再進(jìn)行交換熄守。設(shè)密文為C蜈垮,則加密過程為:
(8)解密過程為:
MAC上生成公鑰、私鑰的方法裕照,及使用
1.打開終端攒发,切換到自己想輸出的文件夾下
2.輸入指令:openssl(openssl是生成各種秘鑰的工具,mac已經(jīng)嵌入)
3.輸入指令:genrsa -out rsa_private_key.pem 1024 (生成私鑰晋南,java端使用的)
4.輸入指令:rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout(生成公鑰)
-
5.輸入指令:pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt(私鑰轉(zhuǎn)格式惠猿,在ios端使用私鑰解密時(shí)用這個(gè)私鑰)
注意:在MAC上生成三個(gè).pem格式的文件,一個(gè)公鑰负间,兩個(gè)私鑰偶妖,都可以在終端通過指令vim xxx.pem 打開,里面是字符串政溃,第三步生成的私鑰是java端用來解密數(shù)據(jù)的趾访,第五步轉(zhuǎn)換格式的私鑰iOS端可以用來調(diào)試公鑰、私鑰解密
本文轉(zhuǎn)載自:https://blog.csdn.net/jack85986370/article/details/51362278