一姥闪、動態(tài)密碼:
我們在登錄一個手機app時蛔溃,每次輸入的賬戶密碼都是固定的。但是這樣呢如果通過網(wǎng)絡請求發(fā)送時瓦宜,容易被攔截獲取到賬號密碼蔚万。其中有一種加密的方式,就是使用動態(tài)的密碼進行登錄临庇。這樣保密性會高很多反璃。動態(tài)密碼,實際上是先將普通密碼加密再加上一段會變化的數(shù)據(jù)(比如時間)再進行一次加密假夺。這樣我們每次獲得的密碼部分都是不同的淮蜈。這就是動態(tài)密碼的大概含義——理解の。
動態(tài)密碼: 相同的密碼明文,每次發(fā)送到服務器,密碼都不同. ---時間戳密碼!
時間間隔越小,密碼安全性越高! 一分鐘/將軍令/U盾
二已卷、時間戳密碼的約定
動態(tài)密碼梧田,我們需要事先和后臺約定好對數(shù)據(jù)的加密方式。
- 服務器和客戶端必須以相同的加密方式加密侧蘸。
- 服務器時間和客戶端的時間必須一致裁眯。
- 因為我們發(fā)送網(wǎng)絡請求時,需要一點時間讳癌〈┪龋可能會造成我們發(fā)送請求的時間與服務器接收到的時間發(fā)生時間差的情況。所以一段服務器端會計算兩次(當前時間和一分鐘后時間)這樣我們調(diào)用接口時晌坤,會和他們進行判斷逢艘,有一個正確,就認為賬號密碼正確——登錄成功泡仗。
三埋虹、實例代碼步驟
- 對密碼進行加密(調(diào)用到我們寫的加密方法),創(chuàng)建字符串對象password接收娩怎。
- 創(chuàng)建網(wǎng)絡請求字符串urlString搔课,使用賬號和經(jīng)過加密后的密碼password(步驟1)
- 創(chuàng)建url
- 創(chuàng)建網(wǎng)絡請求對象request
- 發(fā)送網(wǎng)絡請求
調(diào)用到我們寫的加密方法
1、創(chuàng)建字符串對象存放服務器拿到的私鑰。
2爬泥、對密碼和私鑰進行第一次加密
3柬讨、獲取當前的時間,并對時間按照一定的格式進行處理
4、將第一次加密后的密碼和經(jīng)過處理的時間進行拼接
5袍啡、拼接后再進行一次加密踩官,然后可以返回當前得到的字符串。
- 其中:
私鑰
第一次加密方式境输,
時間格式處理蔗牡,
時間和密碼拼接方式,
第二次加密方式
以上嗅剖,客戶端和服務器必須是一致的辩越。這樣我們才能獲得相同的結(jié)果。完成登錄注冊驗證信粮。
`- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSString *password = [self md5hmacWithPassword:@"zhangsan"];
NSString *urlString = [NSString stringWithFormat:@"http://localhost/login/loginhmac.php?username=%@&password=%@",@"zhangsan",password];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
}`
從參數(shù)中獲取原始密碼 password 黔攒,返回加密后的.
- (NSString *)md5hmacWithPassword:(NSString *)password
{
// 1、私鑰
NSString *hmacKey = @"8a627a4578ace384017c997f12d68b23";
// 2强缘、對密碼和私鑰進行第一次加密
password = [password hmacMD5StringWithKey:hmacKey];
// 3督惰、取出當前的時間,將當前時間拼接在第一次機密的密碼后面
NSDate *date = [NSDate date];
// 對當前時間做格式化處理.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
NSString *timer = [formatter stringFromDate:date];
//4、 第一次加密之后的密碼拼接當前時間
password = [password stringByAppendingString:timer];
//5旅掂、 對增加了時間戳的字符串進行 hmac 運算.
password = [password hmacMD5StringWithKey:hmacKey];
return password;
}