問題描述
在開發(fā)過程中為了安全移剪,在和服務器進行數(shù)據(jù)交互時喜喂,通常會進行數(shù)據(jù)加密瓤摧,而SHA1就是一種常見的加密方式。在一次開發(fā)中玉吁,前端加密后的字符串和服務器的加密字符串照弥,對應不起來,導致網(wǎng)絡請求失敗进副。
問題原因
經(jīng)過驗證發(fā)現(xiàn)是沒有漢字時这揣,前后端加密字符串能對應起來,網(wǎng)絡請求沒問題敢会。而含有含有漢字時曾沈,就出錯了。
解決方法
在網(wǎng)絡上搜索iOS SHA1加密代碼時鸥昏,基本上都是以下這樣的代碼
- (NSString *)sha1Str:(NSString *)str
{
const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:str.length];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (unsigned int)data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
將前兩行代碼替換成
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
即塞俱,使用下面的方法進行SHA1加密
- (NSString *)sha1Str:(NSString *)str
{
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (unsigned int)data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}