MD5加密是單向的,只能加密不能解密(破解除外)。標題可能會引起讀者誤解,已經改正,感謝Li_Cheng同學的提醒,另外筆者發現Li_Cheng同學有篇MD5加密更為詳盡的文章,推薦閱讀:iOS開發 關于MD5加密的相關使用
Java端的加密解密,讀者可以看這篇文章http://www.lxweimin.com/p/98569e81cc0b
最近做了一個移動項目,是有服務器和客戶端類型的項目,客戶端是要登錄才行的,服務器也會返回數據,服務器是用Java開發的,客戶端要同時支持多平臺(Android、iOS),在處理iOS的數據加密的時候遇到了一些問題。起初采取的方案是DES加密,老大說DES加密是對稱的,網絡抓包加上反編譯可能會被破解,故采取RSA方式加密。RSA加密時需要公鑰和私鑰,客戶端保存公鑰加密數據,服務器保存私鑰解密數據。(iOS端公鑰加密私鑰解密、java端公鑰加密私鑰解密,java端私鑰加密公鑰解密都容易做到,iOS不能私鑰加密公鑰解密,只能用于驗簽)。
iOS無論使用系統自帶的sdk函數,用mac產生的或者使用java的jdk產生的公鑰和私鑰,進行加密解密自己都可以使用。不過ios加密,java解密,或者反過來就不能用了。要么是無法創建報告個-9809或-50的錯誤,要么解出來是亂碼。ios系統函數種只有用公鑰加密,私鑰解密的方式。而公鑰加密每次結果都不同。
1.打開終端,切換到自己想輸出的文件夾下
2.輸入指令:openssl(openssl是生成各種秘鑰的工具,mac已經嵌入
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(私鑰轉格式,在ios端使用私鑰解密時用這個私鑰)
注意:在MAC上生成三個.pem格式的文件,一個公鑰,兩個私鑰,都可以在終端通過指令vim xxx.pem 打開,里面是字符串,第三步生成的私鑰是java端用來解密數據的,第五步轉換格式的私鑰iOS端可以用來調試公鑰、私鑰解密(因為私鑰不留在客戶端)
問題2:服務器返回數據也要加密,老大打算用java私鑰加密,ios用公鑰解密(由于iOS做不到用私鑰加密公鑰解密,只能私鑰加密公鑰驗簽),所以這種方案也有問題。
1 通過簡單的URLENCODE + BASE64編碼防止數據明文傳輸
2 對普通請求、返回數據,生成MD5校驗(MD5中加入動態密鑰),進行數據完整性(簡單防篡改,安全性較低,優點:快速)校驗
3 對于重要數據,使用RSA進行數字簽名,起到防篡改作
4 對于比較敏感的數據,如用戶信息(登陸、注冊等),客戶端發送使用RSA加密,服務器返回使用DES(AES)加密
原因:客戶端發送之所以使用RSA加密,是因為RSA解密需要知道服務器私鑰,而服務器私鑰一般盜取難度較大;如果使用DES的話,可以通過破解客戶端獲取密鑰,安全性較低。而服務器返回之所以使用DES,是因為不管使用DES還是RSA,密鑰(或私鑰)都存儲在客戶端,都存在被破解的風險,因此,需要采用動態密鑰,而RSA的密鑰生成比較復雜,不太適合動態密鑰,并且RSA速度相對較慢,所以選用DES)
所以此次加密,我們選擇了第四種加密方式
1、引入頭文件#import"DES3Util.h"2、加密時調用類方法? +(NSString*) encryptUseDES:(NSString*)plainText key:(NSString*)key;3、解密時調用類方法? +(NSString*)decryptUseDES:(NSString*)cipherText key:(NSString*)key;
1、引入頭文件#import"RSAUtil.h"2、公鑰加密時調用類方法:+ (NSString*)encryptString:(NSString*)str publicKey:(NSString*)pubKey;+ (NSData*)encryptData:(NSData*)data publicKey:(NSString*)pubKey;3、私鑰解密時調用類方法 + (NSString*)decryptString:(NSString*)str privateKey:(NSString*)privKey;+ (NSData*)decryptData:(NSData*)data privateKey:(NSString*)privKey;
1、引入頭文件#import"MD5Util"2、加密時調用方法:- (NSString*)md5:(NSString*)str;
1、引入頭文件#import"AES.h"2、加密時調用方法+ (NSString*)encrypt:(NSString*)message password:(NSString*)password;2、解密時調用的方法+ (NSString*)decrypt:(NSString*)base64EncodedString password:(NSString*)password;
Encryption.gif