十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这些天写的程序需要用到SHA512加密。
创新互联公司长期为数千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为如皋企业提供专业的网站设计、网站制作,如皋网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。顺带着就实现了IOS的SHA1、SHA256、SHA384、SHA512,以及md加密,md5二次加密。写了个示例程序
[背景资料]
MD5即Message Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一
SHA即Secure Hash Algorithm(安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数。
示例程序截图如下:
以上加密均未用到第三方类库,实现都很简单(因为可以调用c/c++共享库来调用),使用起来大体来说只要在需要用到加密的方法里新添一个私有方法就可以了。
需要用到AES加密及base64加密的同学请绕道GTMbase64这个第三方类库,封装的很好了,百度搜一下下载下来就行。
项目源代码见连接。
下面来讲解一下核心代码。
先#import
[32位md5常规加密]
想要实现32位md5加密(包括常规加密及二次加密)的同学只需要在当前类中添加一个私有方法:
//32位MD5加密方式
- (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{
//提取32位MD5散列的中间16位
NSString *md5_32Bit_String=[selfgetMd5_32Bit_String:srcString];
NSString *result = [[md5_32Bit_String substringToIndex:24] substringFromIndex:8];//即9~25位
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这个第三方类库,封装的很好了,百度搜一下下载下来就行。
其他截图:
有任何意见建议以及不懂的地方欢迎联系作者:任硕
源代码见附件:
附件:http://down.51cto.com/data/2363185另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。