iOS中加密的使用

来源:互联网 发布:linux远程访问数据库 编辑:程序博客网 时间:2024/05/21 07:52

一.对称算法:(可逆算法)

加密使用相同的秘钥,速度快,适合大数据加密,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"];


获取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];



0 0
原创粉丝点击