網(wǎng)絡(luò)請求中為了數(shù)據(jù)的安全性 , 通常會對數(shù)據(jù)進(jìn)行加密之后再以JSON形式傳輸?shù)胶笈_ . 就算請求被攔截 , 也可以有效的保護(hù)用戶信息的安全性 . 今天就分享一下 常用的一些加密技術(shù) .
MD5 加密
MD5是利用哈希算法來加密的铺厨。哈希算法是一種摘要算法太颤,MD5有以下兩個最主要的特性 , 常用于用戶密碼的加密使用。
- 加密的不可逆性窖式,只能夠加密,不能夠解密痊项。
- 任意長度的明文經(jīng)過加密后長度都是固定的锅风,長度為16進(jìn)制32位。
使用MD5 加密之前應(yīng)該先導(dǎo)入框架 #import "CommonCrypto/CommonDigest.h"
// MD5 轉(zhuǎn)碼
-(NSString *) md5: (NSString *) inPutText
{
const char *cStr = [inPutText UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
return [[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
] lowercaseString];
}
DES加密
DES 加密是一種對稱式加密方法 . 其特點(diǎn)是
- 加密與解密使用同一套密鑰 , 使用方便 .
- 具有相當(dāng)高的復(fù)雜性, 其安全性僅以加密密鑰的保密為基礎(chǔ) .
與MD5 一樣也需要導(dǎo)入框架#import "CommonCrypto/CommonDigest.h"
然后還要導(dǎo)入GTMBase64文件
//加密
+(NSString *)decryptWithContent:(NSString *)content
{
//密鑰 "abc123"
char * keyChar =(char*)[@"abc123" UTF8String];
if (content == nil) {
content = @"";
}
NSString *jm = [NSString stringWithCString:encryptWithKeyAndType([content UTF8String], kCCEncrypt, keyChar) encoding:NSUTF8StringEncoding];
return jm;
}
//解密
+ (NSData *)encryptWithContent:(NSData *)content
{
NSString *contentStr = [[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding];
if (contentStr == nil || [contentStr isEqualToString:@""]) {
return nil;
}
const char * contentChar =[contentStr UTF8String];
//密鑰 "abc123"
char * keyChar =(char*)[@"abc123" UTF8String];
const char *miChar;
miChar = encryptWithKeyAndType(contentChar, kCCDecrypt, keyChar);
if (miChar == nil) {
miChar = "";
}
NSString *zmStr = [NSString stringWithCString:miChar encoding:NSUTF8StringEncoding];
if (zmStr == nil) {
zmStr =@"";
}
return [zmStr dataUsingEncoding:NSUTF8StringEncoding];
}
//核心代碼
static const char* encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key)
{
NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding];
// NSLog(@"[[item.url description] UTF8String=%@",textString);
const void *dataIn;
size_t dataInLength;
if (encryptOperation == kCCDecrypt)//傳遞過來的是decrypt 解碼
{
//解碼 base64
NSData *decryptData = [GTMBase64 decodeData:[textString dataUsingEncoding:NSUTF8StringEncoding]];//轉(zhuǎn)成utf-8并decode
dataInLength = [decryptData length];
dataIn = [decryptData bytes];
}
else //encrypt
{
NSData* encryptData = [textString dataUsingEncoding:NSUTF8StringEncoding];
dataInLength = [encryptData length];
dataIn = (const void *)[encryptData bytes];
}
CCCryptorStatus ccStatus;
uint8_t *dataOut = NULL; //可以理解位type/typedef 的縮寫(有效的維護(hù)了代碼鞍泉,比如:一個人用int皱埠,一個人用long。最好用typedef來定義)
size_t dataOutAvailable = 0; //size_t 是操作符sizeof返回的結(jié)果類型
size_t dataOutMoved = 0;
dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
memset((void *)dataOut, 00, dataOutAvailable);//將已開辟內(nèi)存空間buffer的首 1 個字節(jié)的值設(shè)為值 0
//NSString *initIv = @"12345678";
const void *vkey = key;
const void *iv = (const void *) key; //[initIv UTF8String];
//CCCrypt函數(shù) 加密/解密
ccStatus = CCCrypt(encryptOperation,// 加密/解密
kCCAlgorithmDES,// 加密根據(jù)哪個標(biāo)準(zhǔn)(des咖驮,3des边器,aes。托修。忘巧。。)
kCCOptionPKCS7Padding,// 選項分組密碼算法(des:對每塊分組加一次密 3DES:對每塊分組加三個不同的密)
vkey, //密鑰 加密和解密的密鑰必須一致
kCCKeySizeDES,// DES 密鑰的大心廊小(kCCKeySizeDES=8)
iv, // 可選的初始矢量
dataIn, // 數(shù)據(jù)的存儲單元
dataInLength,// 數(shù)據(jù)的大小
(void *)dataOut,// 用于返回數(shù)據(jù)
dataOutAvailable,
&dataOutMoved);
NSString *result = nil;
if (encryptOperation == kCCDecrypt)//encryptOperation==1 解碼
{
//得到解密出來的data數(shù)據(jù)砚嘴,改變?yōu)閡tf-8的字符串
result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding];
}
else //encryptOperation==0 (加密過程中,把加好密的數(shù)據(jù)轉(zhuǎn)成base64的)
{
//編碼 base64
NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
result = [GTMBase64 stringByEncodingData:data];
}
return [result UTF8String];
}
AES加密
AES加密是一種更高級的對稱加密算法 . 其特點(diǎn)是
- 密鑰為128位(也有192-256的變體) , 相比DES(56位)更安全.
- 隱藏了明文模式 , 分組密碼轉(zhuǎn)化為流模式
先導(dǎo)入框架 #import <CommonCrypto/CommonCryptor.h>
代碼下載地址
//加密
- (NSData *)AES256EncryptWithKey:(NSString *)key {
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}
//解密
- (NSData *)AES256DecryptWithKey:(NSString *)key {
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //free the buffer;
return nil;
}
如果感覺還不錯 , 點(diǎn)擊喜歡鼓勵一下哦 ????????