基于Token的身份驗證——JWT
JWT就是一個字符串,經(jīng)過加密處理與校驗處理的字符串剩辟,形式為:A.B.C
A由JWT頭部信息header加密得到
B由JWT用到的身份驗證信息json數(shù)據(jù)加密得到
C由A和B加密得到元扔,是校驗部分
- 怎樣生成A躯保?
header格式為
{
"typ": "JWT",
"alg": "RS256"
}
它就是一個json串,兩個字段是必須的澎语,不能多也不能少途事。alg字段指定了生成C的算法,默認值是HS256
將header用Base64Url編碼擅羞,得到A
通常尸变,JWT庫中,可以把A部分固定寫死减俏,用戶最多指定一個alg的取值
- 怎么生成B(載荷Payload) ?
我們先將用戶認證的操作描述成一個JSON對象召烂。其中添加了一些其他的信息,幫助今后收到這個JWT的服務器理解這個JWT娃承。
{
"sub": "1",
"iss": "http://localhost:8000/auth/login",
"iat": 1451888119,
"exp": 1454516119,
"nbf": 1451888119,
"jti": "37c107e4609ddbcc9c096ea5ee76c667"
}
將上面的JSON對象進行Base64Url編碼,得到B
- 怎樣計算C 奏夫?
將A.B使用RS256加密(其實是用header中指定的算法)怕篷,當然加密過程中還需要密鑰(自行指定的一個字符串)。
加密得到C酗昼,學名signature廊谓,其實就是一個字符串。作用類似于CRC校驗麻削,保證加密沒有問題蒸痹。
現(xiàn)在A.B.C就是生成的token了。
可以使用
JWT調(diào)試
JWT
Objective-C JWT https://github.com/yourkarma/JWT
我們使用的是RSA256
文檔
// Encode
NSDictionary *payload = @{@"payload" : @"hidden_information"};
NSString *algorithmName = @"RS256";
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"secret_key" ofType:@"p12"];
NSData *privateKeySecretData = [NSData dataWithContentsOfFile:filePath];
NSString *passphraseForPrivateKey = @"secret";
JWTBuilder *builder = [JWTBuilder encodePayload:payload].secretData(privateKeySecretData).privateKeyCertificatePassphrase(passphraseForPrivateKey).algorithmName(algorithmName);
NSString *token = builder.encode;
// check error
if (builder.jwtError == nil) {
// handle result
}
else {
// error occurred.
}
// Decode
// Suppose, that you get token from previous example. You need a valid public key for a private key in previous example.
// Private key stored in @"secret_key.p12". So, you need public key for that private key.
NSString *publicKey = @"..."; // load public key. Or use it as raw string.
algorithmName = @"RS256";
JWTBuilder *decodeBuilder = [JWTBuilder decodeMessage:token].secret(publicKey).algorithmName(algorithmName);
NSDictionary *envelopedPayload = decodeBuilder.decode;
// check error
if (decodeBuilder.jwtError == nil) {
// handle result
}
else {
// error occurred.
}
生成公鑰和私鑰
- 使用openssl生成所需秘鑰文件
生成環(huán)境是在mac系統(tǒng)下碟婆,使用openssl進行生成电抚,首先打開終端,按下面這些步驟依次來做:打開openssl
1.生成模長為1024bit的私鑰文件private_key.pem
genrsa -out private_key.pem 1024
- 生成證書請求文件
rsaCertReq.csr
req -new -key private_key.pem -out rsaCerReq.csr
注意:這一步會提示輸入國家竖共、省份蝙叛、mail等信息,可以根據(jù)實際情況填寫,我測試了不填寫的情況,會報錯.這里會提示輸入密碼
- 生成證書
rsaCert.crt
公给,并設置有效時間為10年
x509 -req -days 3650 -in rsaCerReq.csr -signkey private_key.pem -out rsaCert.crt
- 生成供iOS使用的公鑰文件
public_key.der
x509 -outform der -in rsaCert.crt -out public_key.der
- 生成供iOS使用的私鑰文件
private_key.p12
pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
注意:這一步會提示給私鑰文件設置密碼借帘,直接輸入想要設置密碼即可,然后敲回車淌铐,然后再驗證剛才設置的密碼肺然,再次輸入密碼,然后敲回車腿准,完畢际起!
在解密時,private_key.p12文件需要和這里設置的密碼配合使用吐葱,因此需要牢記此密碼.
- 生成供Java使用的公鑰
rsa_public_key.pem
rsa -in private_key.pem -out rsa_public_key.pem -pubout
- 生成供Java使用的私鑰
pkcs8_private_key.pem
pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt
把.der和.p12格式的秘鑰文件導入工程中,把私鑰和秘鑰發(fā)給后臺,使用一套私鑰秘鑰,就完成了JWT token的生成!
參考博客
基于Token的身份驗證——JWT
JWT的定義及其組成
初步理解JWT并實踐使用
iOS中使用RSA加密
iOS之RSA加密解密與后臺之間的雙向加密詳解
iOS網(wǎng)絡請求安全(JWT街望,RSA)