之前項(xiàng)目中采取的加密方式,只是對(duì)于重要的參數(shù)進(jìn)行AES加密,再將各個(gè)參數(shù)拼接而成,通過MD5簽名后形成最后一個(gè)參數(shù)。目前,改用了RSA加密簽名的方式進(jìn)行加密,總結(jié)了下iOS中常用的加密方式。
AES加密
主要針對(duì)于些重要的參數(shù)進(jìn)行加密,如賬號(hào)、密碼等,具體代碼實(shí)現(xiàn)可下Demo查看
//AES加密
- (NSData *)AES128EncryptedDataWithKey:(NSString *)key iv:(NSString *)iv
{
return [self AES128Operation:kCCEncrypt key:key iv:iv];
}
//AES解密
- (NSData *)AES128DecryptedDataWithKey:(NSString *)key iv:(NSString *)iv
{
return [self AES128Operation:kCCDecrypt key:key iv:iv];
}
- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv
{
char keyPtr[kCCKeySizeAES128 + 1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128 + 1];
bzero(ivPtr, sizeof(ivPtr));
if (iv) {
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
}
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(operation,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
DES加密
//des加密
+ (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
voidvoid *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeDES,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
//des解密
+ (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
voidvoid *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeDES,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
}
MD5加密
MD5加密一般用于數(shù)據(jù)準(zhǔn)確性檢測(cè),加密結(jié)果不可逆,一般用于不需要解密的地方.
iOS SDK自帶有MD5加密的框架CommonCrypto,使用時(shí)導(dǎo)入即可。
可以根據(jù)需要選擇16位、32位、64位的。
#import "CommonCrypto/CommonDigest.h"
+ (NSString *)md5HexDigest:(NSString*)input
{
const char* str = [input UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, strlen(str), result);
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];//
for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
[ret appendFormat:@"%02X",result[i]];
}
return ret;
}
RSA加密、解密和簽名、驗(yàn)簽
加密主要是做加密操作,防止信息泄露。
加簽主要是為了防惡意攻擊,防止別人模擬我們的客戶端對(duì)我們的服務(wù)器進(jìn)行攻擊,避免服務(wù)器癱瘓。
公鑰、私鑰
公鑰、私鑰可以使用字符串的形式,也可以用文件的形式。
RSA加密:公鑰放在客戶端,并使用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,服務(wù)端拿到數(shù)據(jù)后用私鑰進(jìn)行解密。
RSA加簽:私鑰放在客戶端,并使用私鑰對(duì)數(shù)據(jù)進(jìn)行加簽,服務(wù)端拿到數(shù)據(jù)后用公鑰進(jìn)行驗(yàn)簽。
RSA加密、解密
RSA加密只需要導(dǎo)入Security.framework框架即可使用 這篇文章有詳細(xì)的代碼可參考,Demo中也有,使用起來比較簡(jiǎn)單。
這里使用的密鑰文件是.der和.p12格式,與java不同
RSA簽名、驗(yàn)簽
簽名和加密使用的是不同的方法,使用下面這個(gè)庫可以實(shí)現(xiàn)RSA簽名(這個(gè)庫也可實(shí)現(xiàn)RSA加密解密的功能)
iOSRSAHandler
簽名方式有兩種:1.MD5+RSA 2.sha+RSA 本庫中的sha加密使用的是sha1,我改成了sha256
其他
base64加密
主要用于隱藏明文,信息可以隨意進(jìn)行解密,iOS 也提供了Base64加密的api,使用非常簡(jiǎn)單。
凱撒加密
凱撒加密是一種簡(jiǎn)單的文字替換加密。例如將字符串中的前幾位進(jìn)行替換。 考慮到加密內(nèi)容不只是英文字母。此處改進(jìn)使用ASCII碼偏移進(jìn)行加密解密。