您的位置:首页 > 移动开发 > IOS开发

iOS中加密的使用

2016-04-24 13:18 465 查看
一.对称算法:(可逆算法)

加密使用相同的秘钥,速度快,适合大数据加密,DES,AES;

二.非对称算法:(可逆算法)

公钥加密,私钥解密;或者,私钥加密,公钥解密,速度慢,适合小数据加密,RSA;

三.普遍的加密方法:

公钥给对称加密的密钥加密,私钥解密.(先用RSA加密AES的密钥)

四.散列算法:(摘取一部分信息加密)(不可逆加密)

MD5,SHA1,SHA256,SHA512;

MD5 算法:对任意的数据源计算,生成固定长度的字符串,32个字符,

终端中测试:MD5 -s"admin"

MD5应用: 验证从网络下载的文件是否被修改过.

SSKeyChain框架:对称加密框架,把钥匙串保存到本地:

保存:[SSKeyChain setPassword: 要保存的密码 forService: [NSBundle mainBUndle].identifier]指定唯一标示 account:指定账号]

读取:[SSkeyChain passwordForService: 唯一标示 account:指定账号]

一,base64 加密解密

#pragma mark base64"加密"

/加密界面都是对二进制进行处理

NSData *data = [stringdataUsingEncoding:NSUTF8StringEncoding];

//指定编码方式.默认0

NSString *base64String= [database64EncodedStringWithOptions:0];

//解密

//二进制

NSData *data = [[NSDataalloc]initWithBase64EncodedString:base64Stringoptions:0];

[[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];

二,MD5(导入算法文件)

#import <Foundation/Foundation.h>

@interface NSString (Hash)

#pragma mark - 散列函数

/**

* 计算MD5散列结果

*

* 终端测试命令:

* @code

* md5 -s "string"

* @endcode

*

* <p>提示:随着 MD5碰撞生成器的出现,MD5算法不应被用于任何软件完整性检查或代码签名的用途。<p>

*

* @return 32个字符的MD5散列字符串

*/

- (NSString *)md5String;

/**

* 计算SHA1散列结果

*

* 终端测试命令:

* @code

* echo -n "string" | openssl sha -sha1

* @endcode

*

* @return 40个字符的SHA1散列字符串

*/

- (NSString *)sha1String;

/**

* 计算SHA256散列结果

*

* 终端测试命令:

* @code

* echo -n "string" | openssl sha -sha256

* @endcode

*

* @return 64个字符的SHA256散列字符串

*/

- (NSString *)sha256String;

/**

* 计算SHA 512散列结果

*

* 终端测试命令:

* @code

* echo -n "string" | openssl sha -sha512

* @endcode

*

* @return 128个字符的SHA 512散列字符串

*/

- (NSString *)sha512String;

#pragma mark - HMAC 散列函数

/**

* 计算HMAC MD5散列结果

*

* 终端测试命令:

* @code

* echo -n "string" | openssl dgst -md5 -hmac "key"

* @endcode

*

* @return 32个字符的HMAC MD5散列字符串

*/

- (NSString *)hmacMD5StringWithKey:(NSString *)key;

/**

* 计算HMAC SHA1散列结果

*

* 终端测试命令:

* @code

* echo -n "string" | openssl sha -sha1 -hmac "key"

* @endcode

*

* @return 40个字符的HMAC SHA1散列字符串

*/

- (NSString *)hmacSHA1StringWithKey:(NSString *)key;

/**

* 计算HMAC SHA256散列结果

*

* 终端测试命令:

* @code

* echo -n "string" | openssl sha -sha256 -hmac "key"

* @endcode

*

* @return 64个字符的HMAC SHA256散列字符串

*/

- (NSString *)hmacSHA256StringWithKey:(NSString *)key;

/**

* 计算HMAC SHA512散列结果

*

* 终端测试命令:

* @code

* echo -n "string" | openssl sha -sha512 -hmac "key"

* @endcode

*

* @return 128个字符的HMAC SHA512散列字符串

*/

- (NSString *)hmacSHA512StringWithKey:(NSString *)key;

#pragma mark - 文件散列函数

/**

* 计算文件的MD5散列结果

*

* 终端测试命令:

* @code

* md5 file.dat

* @endcode

*

* @return 32个字符的MD5散列字符串

*/

- (NSString *)fileMD5Hash;

/**

* 计算文件的SHA1散列结果

*

* 终端测试命令:

* @code

* openssl sha -sha1 file.dat

* @endcode

*

* @return 40个字符的SHA1散列字符串

*/

- (NSString *)fileSHA1Hash;

/**

* 计算文件的SHA256散列结果

*

* 终端测试命令:

* @code

* openssl sha -sha256 file.dat

* @endcode

*

* @return 64个字符的SHA256散列字符串

*/

- (NSString *)fileSHA256Hash;

/**

* 计算文件的SHA512散列结果

*

* 终端测试命令:

* @code

* openssl sha -sha512 file.dat

* @endcode

*

* @return 128个字符的SHA512散列字符串

*/

- (NSString *)fileSHA512Hash;

@end

#import "NSString+Hash.h"

#import <CommonCrypto/CommonCrypto.h>

@implementation NSString (Hash)

#pragma mark - 散列函数

- (NSString *)md5String {

const char *str =self.UTF8String;

uint8_t buffer[CC_MD5_DIGEST_LENGTH];

CC_MD5(str, (CC_LONG)strlen(str), buffer);

return [selfstringFromBytes:bufferlength:CC_MD5_DIGEST_LENGTH];

}

- (NSString *)sha1String {

const char *str =self.UTF8String;

uint8_t buffer[CC_SHA1_DIGEST_LENGTH];

CC_SHA1(str, (CC_LONG)strlen(str), buffer);

return [selfstringFromBytes:bufferlength:CC_SHA1_DIGEST_LENGTH];

}

- (NSString *)sha256String {

const char *str =self.UTF8String;

uint8_t buffer[CC_SHA256_DIGEST_LENGTH];

CC_SHA256(str, (CC_LONG)strlen(str), buffer);

return [selfstringFromBytes:bufferlength:CC_SHA256_DIGEST_LENGTH];

}

- (NSString *)sha512String {

const char *str =self.UTF8String;

uint8_t buffer[CC_SHA512_DIGEST_LENGTH];

CC_SHA512(str, (CC_LONG)strlen(str), buffer);

return [selfstringFromBytes:bufferlength:CC_SHA512_DIGEST_LENGTH];

}

#pragma mark - HMAC 散列函数

- (NSString *)hmacMD5StringWithKey:(NSString *)key {

const char *keyData = key.UTF8String;

const char *strData =self.UTF8String;

uint8_t buffer[CC_MD5_DIGEST_LENGTH];

CCHmac(kCCHmacAlgMD5, keyData,strlen(keyData), strData,strlen(strData), buffer);

return [selfstringFromBytes:bufferlength:CC_MD5_DIGEST_LENGTH];

}

- (NSString *)hmacSHA1StringWithKey:(NSString *)key {

const char *keyData = key.UTF8String;

const char *strData =self.UTF8String;

uint8_t buffer[CC_SHA1_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA1, keyData,strlen(keyData), strData,strlen(strData), buffer);

return [selfstringFromBytes:bufferlength:CC_SHA1_DIGEST_LENGTH];

}

- (NSString *)hmacSHA256StringWithKey:(NSString *)key {

const char *keyData = key.UTF8String;

const char *strData =self.UTF8String;

uint8_t buffer[CC_SHA256_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA256, keyData,strlen(keyData), strData,strlen(strData), buffer);

return [selfstringFromBytes:bufferlength:CC_SHA256_DIGEST_LENGTH];

}

- (NSString *)hmacSHA512StringWithKey:(NSString *)key {

const char *keyData = key.UTF8String;

const char *strData =self.UTF8String;

uint8_t buffer[CC_SHA512_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA512, keyData,strlen(keyData), strData,strlen(strData), buffer);

return [selfstringFromBytes:bufferlength:CC_SHA512_DIGEST_LENGTH];

}

#pragma mark - 文件散列函数

#define FileHashDefaultChunkSizeForReadingData 4096

- (NSString *)fileMD5Hash {

NSFileHandle *fp = [NSFileHandlefileHandleForReadingAtPath:self];

if (fp == nil) {

return nil;

}

CC_MD5_CTX hashCtx;

CC_MD5_Init(&hashCtx);

while (YES) {

@autoreleasepool {

NSData *data = [fpreadDataOfLength:FileHashDefaultChunkSizeForReadingData];

CC_MD5_Update(&hashCtx, data.bytes, (CC_LONG)data.length);

if (data.length ==0) {

break;

}

}

}

[fp closeFile];

uint8_t buffer[CC_MD5_DIGEST_LENGTH];

CC_MD5_Final(buffer, &hashCtx);

return [selfstringFromBytes:bufferlength:CC_MD5_DIGEST_LENGTH];

}

- (NSString *)fileSHA1Hash {

NSFileHandle *fp = [NSFileHandlefileHandleForReadingAtPath:self];

if (fp == nil) {

return nil;

}

CC_SHA1_CTX hashCtx;

CC_SHA1_Init(&hashCtx);

while (YES) {

@autoreleasepool {

NSData *data = [fpreadDataOfLength:FileHashDefaultChunkSizeForReadingData];

CC_SHA1_Update(&hashCtx, data.bytes, (CC_LONG)data.length);

if (data.length ==0) {

break;

}

}

}

[fp closeFile];

uint8_t buffer[CC_SHA1_DIGEST_LENGTH];

CC_SHA1_Final(buffer, &hashCtx);

return [selfstringFromBytes:bufferlength:CC_SHA1_DIGEST_LENGTH];

}

- (NSString *)fileSHA256Hash {

NSFileHandle *fp = [NSFileHandlefileHandleForReadingAtPath:self];

if (fp == nil) {

return nil;

}

CC_SHA256_CTX hashCtx;

CC_SHA256_Init(&hashCtx);

while (YES) {

@autoreleasepool {

NSData *data = [fpreadDataOfLength:FileHashDefaultChunkSizeForReadingData];

CC_SHA256_Update(&hashCtx, data.bytes, (CC_LONG)data.length);

if (data.length ==0) {

break;

}

}

}

[fp closeFile];

uint8_t buffer[CC_SHA256_DIGEST_LENGTH];

CC_SHA256_Final(buffer, &hashCtx);

return [selfstringFromBytes:bufferlength:CC_SHA256_DIGEST_LENGTH];

}

- (NSString *)fileSHA512Hash {

NSFileHandle *fp = [NSFileHandlefileHandleForReadingAtPath:self];

if (fp == nil) {

return nil;

}

CC_SHA512_CTX hashCtx;

CC_SHA512_Init(&hashCtx);

while (YES) {

@autoreleasepool {

NSData *data = [fpreadDataOfLength:FileHashDefaultChunkSizeForReadingData];

CC_SHA512_Update(&hashCtx, data.bytes, (CC_LONG)data.length);

if (data.length ==0) {

break;

}

}

}

[fp closeFile];

uint8_t buffer[CC_SHA512_DIGEST_LENGTH];

CC_SHA512_Final(buffer, &hashCtx);

return [selfstringFromBytes:bufferlength:CC_SHA512_DIGEST_LENGTH];

}

#pragma mark - 助手方法

/**

* 返回二进制 Bytes流的字符串表示形式

*

* @param bytes 二进制 Bytes数组

* @param length 数组长度

*

* @return 字符串表示形式

*/

- (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length {

NSMutableString *strM = [NSMutableStringstring];

for (int i =0; i < length; i++) {

[strM appendFormat:@"%02x", bytes[i]];

}

return [strM copy];

}

1 使用md5对密码加密

pwd = [pwd md5String];

2 加盐 原密码 + 一个字符串----MD5加密1

pwd = [[pwd stringByAppendingString:@"123abcABC!@##$%$%^!!@Aasdas"] md5String];

3 HMAC a.原密码 + 一个字符串----MD5加密1 ;

b. MD5加密1 + 原密码 -----MD5加密2;

pwd = [pwd hmacMD5StringWithKey:@"abc123"];

4 获取pwd + time的一个密码

- (NSString *)getPWD:(NSString *)pwd {

// 1 一个字符串key md5计算

NSString *md5Key = [@"itcast"md5String];

// 2 把原密码和之前生成的md5值再进行hmac加密

NSString *hmacKey = [pwd
hmacMD5StringWithKey:md5Key];

// 3 从服务器获取当前时间到分钟的字符串

NSURL *url = [NSURLURLWithString:@"http://127.0.0.1/php/hmackey.php"];

NSData *data = [NSDatadataWithContentsOfURL:url];

//JSON的反序列化

NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:dataoptions:0error:NULL];

NSString *time = dic[@"key"];

// 4 第二步产生的hmac值+时间 和第一步产生的md5值进行hmac加密

return [[hmacKey
stringByAppendingString:time] hmacMD5StringWithKey:md5Key];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: