這些天寫的程序需要用到SHA512加密。
順帶着就實現了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 <CommonCrypto/CommonDigest.h>
[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://code4app.com/ios/md5和sha加密代碼實現/51ed36fe6803faf263000000
本文出自 “developerPan的IOS之路” 博客,請務必保留此出處http://developerpan.blog.51cto.com/7454463/1254875