文件在下載完成之后通常會進行Hash校驗,因此客戶端通過計算文件Hash值驗證機制來確保文件上傳下載后的完整性.計算方式比較常用的有MD5和SHA,兩種計算方式不可逆和無沖突,其中MD5計算文件的Hash值較為普遍.
SHA加密
導入頭文件
#include <CommonCrypto/CommonDigest.h>
+ (NSString *)computeHashForFile:(NSURL *)fileURL {
NSString *fileContentsHash;
if ([[NSFileManager defaultManager] fileExistsAtPath:[fileURL path]]) {
NSData *fileContents = [NSData dataWithContentsOfURL:fileURL];
fileContentsHash = [self computeHashForData:fileContents];
}
return fileContentsHash;
}
+ (NSString *)computeHashForData:(NSData *)inputData {
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(inputData.bytes, (CC_LONG)inputData.length, digest);
NSMutableString* inputHash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[inputHash appendFormat:@"%02x", digest[i]];
}
return inputHash;
}
MD5計算
+ (NSString *)computeHashForFile:(NSURL *)fileURL {
NSString *fileContentsHash;
if ([[NSFileManager defaultManager] fileExistsAtPath:[fileURL path]]) {
NSData *fileContents = [NSData dataWithContentsOfURL:fileURL];
fileContentsHash = [self computeHashForData:fileContents];
}
return fileContentsHash;
}
+ (NSString *)computeHashForData:(NSData *)inputData {
uint8_t digest[CC_MD5_DIGEST_LENGTH];
CC_MD5(inputData.bytes, (CC_LONG)inputData.length, digest);
NSMutableString *inputHash = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[inputHash appendFormat:@"%02x", digest[i]];
}
return inputHash;
}
字符串Hash值計算:
+ (NSString *)computeHashForString:(NSString *)string {
const char *cStr = [string UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, (CC_LONG)strlen(cStr), digest);
NSMutableString *hash = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", digest[i]];
}
return hash;
}