更新:MD5加密是單向的垛孔,只能加密不能解密(破解除外)藕甩。標(biāo)題可能會(huì)引起讀者誤解,已經(jīng)改正周荐,感謝Li_Cheng同學(xué)的提醒辛萍,另外筆者發(fā)現(xiàn)Li_Cheng同學(xué)有篇MD5加密更為詳盡的文章,推薦閱讀:iOS開發(fā) 關(guān)于MD5加密的相關(guān)使用
java端的加密解密贩毕,讀者可以看我同事的這篇文章http://www.reibang.com/p/98569e81cc0b
最近做了一個(gè)移動(dòng)項(xiàng)目,是有服務(wù)器和客戶端類型的項(xiàng)目仆嗦,客戶端是要登錄才行的辉阶,服務(wù)器也會(huì)返回?cái)?shù)據(jù),服務(wù)器是用Java開發(fā)的瘩扼,客戶端要同時(shí)支持多平臺(tái)(Android谆甜、iOS),在處理iOS的數(shù)據(jù)加密的時(shí)候遇到了一些問題集绰。起初采取的方案是DES加密规辱,老大說DES加密是對(duì)稱的,網(wǎng)絡(luò)抓包加上反編譯可能會(huì)被破解栽燕,故采取RSA方式加密罕袋。RSA加密時(shí)需要公鑰和私鑰,客戶端保存公鑰加密數(shù)據(jù)碍岔,服務(wù)器保存私鑰解密數(shù)據(jù)浴讯。(iOS端公鑰加密私鑰解密、java端公鑰加密私鑰解密蔼啦,java端私鑰加密公鑰解密都容易做到榆纽,iOS不能私鑰加密公鑰解密,只能用于驗(yàn)簽)捏肢。
問題
問題1:iOS端公鑰加密的數(shù)據(jù)用Java端私鑰解密奈籽。
iOS無論使用系統(tǒng)自帶的sdk函數(shù),用mac產(chǎn)生的或者使用java的jdk產(chǎn)生的公鑰和私鑰鸵赫,進(jìn)行加密解密自己都可以使用衣屏。不過ios加密,java解密奉瘤,或者反過來就不能用了勾拉。要么是無法創(chuàng)建報(bào)告?zhèn)€-9809或-50的錯(cuò)誤煮甥,要么解出來是亂碼盗温。ios系統(tǒng)函數(shù)種只有用公鑰加密藕赞,私鑰解密的方式。而公鑰加密每次結(jié)果都不同卖局。
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)試公鑰劲妙、私鑰解密(因?yàn)樗借€不留在客戶端)
問題2:服務(wù)器返回?cái)?shù)據(jù)也要加密,老大打算用java私鑰加密,ios用公鑰解密(由于iOS做不到用私鑰加密公鑰解密儒喊,只能私鑰加密公鑰驗(yàn)簽)镣奋,所以這種方案也有問題。
通過看一些大牛的介紹怀愧,了解了iOS常用的加密方式
1 通過簡(jiǎn)單的URLENCODE + BASE64編碼防止數(shù)據(jù)明文傳輸
2 對(duì)普通請(qǐng)求侨颈、返回?cái)?shù)據(jù),生成MD5校驗(yàn)(MD5中加入動(dòng)態(tài)密鑰)芯义,進(jìn)行數(shù)據(jù)完整性(簡(jiǎn)單防篡改肛搬,安全性較低,優(yōu)點(diǎn):快速)校驗(yàn)
3 對(duì)于重要數(shù)據(jù)毕贼,使用RSA進(jìn)行數(shù)字簽名温赔,起到防篡改作
4 對(duì)于比較敏感的數(shù)據(jù),如用戶信息(登陸鬼癣、注冊(cè)等)陶贼,客戶端發(fā)送使用RSA加密,服務(wù)器返回使用DES(AES)加密
原因:客戶端發(fā)送之所以使用RSA加密待秃,是因?yàn)镽SA解密需要知道服務(wù)器私鑰拜秧,而服務(wù)器私鑰一般盜取難度較大;如果使用DES的話章郁,可以通過破解客戶端獲取密鑰枉氮,安全性較低志衍。而服務(wù)器返回之所以使用DES,是因?yàn)椴还苁褂肈ES還是RSA聊替,密鑰(或私鑰)都存儲(chǔ)在客戶端楼肪,都存在被破解的風(fēng)險(xiǎn),因此惹悄,需要采用動(dòng)態(tài)密鑰春叫,而RSA的密鑰生成比較復(fù)雜,不太適合動(dòng)態(tài)密鑰泣港,并且RSA速度相對(duì)較慢暂殖,所以選用DES)
所以此次加密,我們選擇了第四種加密方式
加密方式
ios端進(jìn)行DES加密当纱、解密時(shí)非常方便
1呛每、引入頭文件#import"DES3Util.h"2、加密時(shí)調(diào)用類方法? +(NSString*) encryptUseDES:(NSString*)plainText key:(NSString*)key;3坡氯、解密時(shí)調(diào)用類方法? +(NSString*)decryptUseDES:(NSString*)cipherText key:(NSString*)key;
ios端進(jìn)行RSA加密晨横、解密時(shí)非常方便
1、引入頭文件#import"RSAUtil.h"2廉沮、公鑰加密時(shí)調(diào)用類方法:+ (NSString*)encryptString:(NSString*)str publicKey:(NSString*)pubKey;+ (NSData*)encryptData:(NSData*)data publicKey:(NSString*)pubKey;3颓遏、私鑰解密時(shí)調(diào)用類方法 + (NSString*)decryptString:(NSString*)str privateKey:(NSString*)privKey;+ (NSData*)decryptData:(NSData*)data privateKey:(NSString*)privKey;
ios端進(jìn)行MD5加密、解密時(shí)非常方便
1滞时、引入頭文件#import"MD5Util"2叁幢、加密時(shí)調(diào)用方法:- (NSString*)md5:(NSString*)str;
ios端進(jìn)行AES加密、解密時(shí)非常方便
1坪稽、引入頭文件#import"AES.h"2曼玩、加密時(shí)調(diào)用方法+ (NSString*)encrypt:(NSString*)message password:(NSString*)password;2、解密時(shí)調(diào)用的方法+ (NSString*)decrypt:(NSString*)base64EncodedString password:(NSString*)password;
自己與服務(wù)器調(diào)試DES解密 ?在github有 ? oc代碼 ?:
//1窒百、 獲取證書 ?
//2黍判、 des 解密
不理解可以問我 , 我也是剛知道 ?篙梢,如果是大神請(qǐng)多多指教顷帖。
參考文章鏈接:http://www.reibang.com/p/8fd8306a95d0