温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

IOS之sha加密、md5常规加密、md5二次加密详解及示例程序

发布时间:2020-07-09 01:06:16 来源:网络 阅读:10728 作者:developerPan 栏目:移动开发

这些天写的程序需要用到SHA512加密。

顺带着就实现了IOS的SHA1、SHA256、SHA384、SHA512,以及md加密,md5二次加密。写了个示例程序

[背景资料]

MD5即Message Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一
SHA即Secure Hash Algorithm(安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数。


示例程序截图如下:

IOS之sha加密、md5常规加密、md5二次加密详解及示例程序


以上加密均未用到第三方类库,实现都很简单(因为可以调用c/c++共享库来调用),使用起来大体来说只要在需要用到加密的方法里新添一个私有方法就可以了。

需要用到AES加密及base64加密的同学请绕道GTMbase64这个第三方类库,封装的很好了,百度搜一下下载下来就行。



项目源代码见连接。

下面来讲解一下核心代码。


#import <CommonCrypto/CommonDigest.h>



[32位md5常规加密]


想要实现32位md5加密(包括常规加密及二次加密)的同学只需要在当前类中添加一个私有方法:


//32MD5加密方式

- (NSString *)getMd5_32Bit_String:(NSString *)srcString{

   constchar *cStr = [srcString UTF8String];

   unsignedchar digest[CC_MD5_DIGEST_LENGTH];

   CC_MD5( cStr, strlen(cStr), digest );

   NSMutableString *result = [NSMutableStringstringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

   for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)

      [result appendFormat:@"%02x", digest[i]];


   return result;

}


之后在需要用到加密的地方调用[self getMd5_32Bit_String:@"xxx"];就能得到加密过的字符串啦。


[16位md5常规加密]

想要实现16位加密?

很简单,提取md5散列中的16位就行!(复制以下代码及上一段代码到当前类中)

- (NSString *)getMd5_16Bit_String:(NSString *)srcString{

   //提取32MD5散列的中间16

   NSString *md5_32Bit_String=[selfgetMd5_32Bit_String:srcString];

   NSString *result = [[md5_32Bit_String substringToIndex:24] substringFromIndex:8];//925


   return result;

}


之后在需要用到加密的地方调用[self getMd5_16Bit_String:@"xxx"];就能得到加密过的字符串啦。


[32位md5二次加密]

更简单了,你只需要调用两次32位md5常规加密就行……

类似于这样:

[resultLabel1setText:[selfgetMd5_32Bit_String:[selfgetMd5_32Bit_String:srcStringTextField.text]]];


[16位md5二次加密]

同上,调用两次16位md5常规加密就行

[resultLabel1setText:[selfgetMd5_32Bit_String:[selfgetMd5_32Bit_String:srcStringTextField.text]]];


[关于大小写]

常规转换没什么可说的,

NSString *result = [selfgetMd5_32Bit_String:srcStringTextField.text] uppercaseString];

就是你要的答案。

二次转换大写要特别注意,第一次转换的结果要先转成大写,然后执行常规转换,然后再将结果转成大写,类似于这样:

   [resultLabel2setText:[[selfgetMd5_32Bit_String:[[selfgetMd5_32Bit_String:srcStringTextField.text] uppercaseString]]uppercaseString]];


[sha1转换]

同样很简单。当前类添加私有方法:

//sha1加密方式

- (NSString *)getSha1String:(NSString *)srcString{

constchar *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSDatadataWithBytes:cstr length:srcString.length];


uint8_t digest[CC_SHA1_DIGEST_LENGTH];


CC_SHA1(data.bytes, data.length, digest);


NSMutableString* result = [NSMutableStringstringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];


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

       [result appendFormat:@"%02x", digest[i]];

   }


return result;

}

需要用到的地方

[resultLabel1setText:[selfgetSha1String:srcStringTextField.text]];

大功告成。


[sha256/sha384/sha512加密]

分别是3个私有方法。

我直接贴出来。

//sha256加密方式

- (NSString *)getSha256String:(NSString *)srcString {

constchar *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSDatadataWithBytes:cstr length:srcString.length];


uint8_t digest[CC_SHA256_DIGEST_LENGTH];


CC_SHA1(data.bytes, data.length, digest);


NSMutableString* result = [NSMutableStringstringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];


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

       [result appendFormat:@"%02x", digest[i]];

   }


return result;

}


//sha384加密方式

- (NSString *)getSha384String:(NSString *)srcString {

constchar *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSDatadataWithBytes:cstr length:srcString.length];


uint8_t digest[CC_SHA384_DIGEST_LENGTH];


CC_SHA1(data.bytes, data.length, digest);


NSMutableString* result = [NSMutableStringstringWithCapacity:CC_SHA384_DIGEST_LENGTH * 2];


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

       [result appendFormat:@"%02x", digest[i]];

   }


return result;

}


//sha512加密方式

- (NSString*) getSha512String:(NSString*)srcString {

constchar *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSDatadataWithBytes:cstr length:srcString.length];

uint8_t digest[CC_SHA512_DIGEST_LENGTH];


CC_SHA512(data.bytes, data.length, digest);


NSMutableString* result = [NSMutableStringstringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];

for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++)

       [result appendFormat:@"%02x", digest[i]];

return result;

}

有没觉得差不多?实际上就是一样样的,只需要换掉CC_SHA1_DIGEST_LENGTH、CC_SHA256_DIGEST_LENGTH、CC_SHA384_DIGEST_LENGTH、CC_SHA512_DIGEST_LENGTH这个宏就可以了。

你需要用到哪一个,就添加哪一个私有方法。调用即可。


[总结]

个人认为sha加密和md5加密完全没必要去导入第三方类库,实际上调用共享库以后就是一个私有方法几行代码的事,何必搞那么复杂呢?

需要用到AES加密及base64加密的同学请绕道GTMbase64这个第三方类库,封装的很好了,百度搜一下下载下来就行。


其他截图:

IOS之sha加密、md5常规加密、md5二次加密详解及示例程序

有任何意见建议以及不懂的地方欢迎联系作者:任硕

源代码见附件:



附件:http://down.51cto.com/data/2363185
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI