一、token
在網站、app與服務器交互的過程中,很多時候為了:
1、避免用戶多次輸入密碼
2、實現自動登陸
3、避免在終端直接存儲用戶的密碼
4、標示客戶端的請求是否合法
5、其他(暫時沒想到)
我們需要引入token機制,基於Token的驗證流程一般是這樣的:
- 客戶端使用用戶名跟密碼請求登錄
- 服務端收到請求,去驗證用戶名與密碼
- 驗證成功后,服務端會簽發一個 Token,這個Token是與用戶名一一對應的,token一般可以存儲在緩存或數據庫中,以方便后面查詢出來進行驗證。再把這個 Token 發送給客戶端
- 客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里
- 客戶端每次向服務端請求資源的時候需要帶着服務端簽發的 Token
- 服務端收到請求,然后去驗證客戶端請求里面帶着的 Token,如果驗證成功,就向客戶端返回請求的數據
Token存在過期時間,在Token生成的時候可以打上一個時間戳,驗證token的時候同時驗證是否過期,並告知終端。終端接收到token過期的返回后,則要求用戶重新輸入用戶名跟密碼,進行登錄。
用戶的一些操作需要從新請求服務端下發token,如退出、修改密碼后重新登錄。
二、加密解密
在客戶端與服務器進行交互時,必然涉及到交互的報文(或者通俗的講,請求數據與返回數據),如果不希望報文進行明文傳輸,則需要進行報文的加密與解密。
所以加密的主要作用就是避免明文傳輸,就算被截獲報文,截獲方也不知道報文的具體內容。
三、簽名
為什么要簽名?
1、在客戶端與服務器進行交互時,報文雖然加密了,但我們並不能確認這個報文是誰發過來的。例如,與第三方服務器B進行交互時,我方收到了一個已加密的請求,但我方並不能確認是服務器B發送的這個報文,此時我們可以用數字簽名的方式來進行驗證。
作用:認證數據來源
2、如果我方收到一個B服務器簽名的請求,那么B服務器也無法否認這個請求,因為帶有它的簽名,作用:抗否認性。
3、我方收到一個B服務器簽名的請求,但我方並不能確認這個請求是否被篡改過(雖然報文加了密,也可能被篡改),此時即可用簽名,驗證簽名中的報文與傳過來的報文是否一致。作用:保證了數據的完整性
遵循規則:公鑰加密,私鑰解密
總結:在實際開發工作中應該 先通過web filter 解密,解密后進行驗證簽名(返回數據時,過程反過來,先簽名再加密);然后再springmvc的Interceptor 中進行驗證token
RSA概要介紹
1976年以前,所有的加密方法都是同一種模式:
- 甲方選擇某一種加密規則,對信息進行加密;
- 乙方使用同一種規則,對信息進行解密
由於加密和解密使用同樣的規則(簡稱“秘鑰”),這種被稱為“對稱加密算法”。這種加密模式有個最大的弱點:甲方必須把加密規則告訴乙方,否則無法解密。保存和傳遞秘鑰成了最頭疼的問題。1976年,兩位美國計算機科學家Whitfield Diffie和Martin Hellman,提出了一種嶄新的構思,可以在不直接傳遞秘鑰完成加密,這個被稱為”Diffie-Hellman密鑰交換算法”。這個算法啟發了其他科學家。人們認識到,加密和解密可以使用不同的規則,這要這種規則直接存在某種對應的關系即可,這樣就避免了直接傳遞秘鑰。這種新的加密模式被稱為“非對稱加密算法”:
- 乙方生成兩把密鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的。
- 甲方獲取乙方的公鑰,然后用它對信息加密。
- 乙方得到加密后的信息,用私鑰解密。
如果公鑰加密的信息只有私鑰解得開,那么只要私鑰不泄漏,通信就是安全的。
1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種算法,可以實現非對稱加密。這種算法用他們三個人的名字命名,叫做RSA算法。從那時直到現在,RSA算法一直是最廣為使用的”非對稱加密算法”。毫不誇張地說,只要有計算機網絡的地方,就有RSA算法。這種算法非常可靠,密鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長RSA密鑰是768個二進制位。也就是說,長度超過768位的密鑰,還無法破解(至少沒人公開宣布)。因此可以認為,1024位的RSA密鑰基本安全,2048位的密鑰極其安全。RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰數據加密標准。
RSA簽名過程
(1)client提取消息m的消息摘要h(m),並使用自己的私鑰對摘要h(m)進行加密,生成簽名s。
(2)client將簽名s和消息m一起,使用server發過來的公鑰進行加密,獲得密文c,發送給server。
RSA驗簽過程
(1)server接受到密文后,用自己的私鑰對其解密,獲得明文消息m和簽名s。
(2)server使用client的公鑰解密數字簽名s,獲得消息摘要h(m)。
(3)server使用相同的方法提取消息m的消息摘要h(m)與上一步解密得到的h(m)進行比較,如果相同則驗簽成功。
使用openssl生成秘鑰
windows環境的操作方法:
1. 工具下載:openssl工具
2. 雙擊運行bin目錄下的openssl.exe
3. 生成RSA私鑰命令:genrsa -out rsa_private_key.pem 1024
4. 生成RSA公鑰命令:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
5. 將RSA私鑰轉換成PKCS8格式:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -out rsa_private_key_pkcs.txt -nocrypt
注意上面提供的測試代碼私鑰是基於pkcs8格式的。
數據摘要
數據摘要就是對數據源進行一個算法之后得到的一個摘要,也叫數據指紋,不同的數據源,摘要結果不一樣。
數據摘要算法是一種能產生特殊輸出格式的算法,其原理是根據一定的運算規則對原始數據進行某種信息的提取,被提取的信息稱為原始數據的信息摘要。
常用的摘要算法有RSA公司的MD5算法和SHA-1算法以及其大量的變體。
數據摘要的特點:
1. 無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。例如應用MD5算法摘要的消息有128個比特位,用SHA-1算法摘要的消息最終有160比特位的輸出。
2. 一般來說(不考慮碰撞的情況下),只要輸入的原始數據不同,對其進行摘要以后產生的消息摘要也必不相同,即使原始數據稍有改變,輸出的消息摘要便完全不同。但是,相同的輸入必會產生相同的輸出。
3. 具有不可逆性,即只能進行正向的信息摘要,而無法從摘要中恢復出任何的原始消息。
數據簽名
大家知道要保證信息的可靠通信,必須要解決兩個問題:一,確定消息的來源就是其申明的那個人;二,要保證數據在傳輸的過程中不被第三方篡改,即使篡改了也能發覺出來。
所謂書數字簽名就是為了解決上述兩個問題二產生,對非對稱加密技術和數據摘要技術的一個具體應用。對消息發送者來說,首先要生成一對公私鑰,將公鑰發給消息接收者。
使用方法:
1. 消息發送者要給消息接收者發送消息,出了發送原始數據外,還需要發送原始數據的數字簽名
2. 對消息接受者來說,它將收到兩個數據,原始數據和簽名數據,它需要判斷這兩個數據的合法信來確保通信的可靠,那么如何操作呢:
(1):對原始數據提取數據摘要,注意這里使用的消息摘要算法和發送方的一致;
(2):對附加的那段數字簽名使用預先得到的公鑰解密;
(3):比較前兩步所得到的兩段消息是否一致。如果一致,則表明消息是可靠的,否則消息在傳輸過程中一定出現了問題,消息不可信。
在加解密的代碼中已經提供了簽名和驗簽的操作,就不在闡述。使用過支付寶的SDK的朋友都知道,向支付寶接口提交訂單信息是就需要對訂單信息進行簽名,支付寶為了確保訂單信息的可靠性就使用了簽名機制。
總結:
- 使用加解密為了保證數據的安全性,公鑰加密私鑰解密;私鑰加密公鑰解密。
- 簽名機制是為了保證數據通信的可靠性,私鑰簽名公鑰驗簽。