Recently in the project to use the network Request signature authentication method, so on the internet to find theOC sha1加密method, quickly found a public use of the package good method, the following code is
First you need to add the header file
#import <CommonCrypto / CommonDigest.h>
Then use the following method directly
// sha1 encryption method
-(NSString *) sha1: (NSString *) input
{
const char * cstr = [input cStringUsingEncoding: NSUTF8StringEncoding];
NSData * data = [NSData dataWithBytes: cstr length: input.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;
}
I used this method directly in the project and solved the problem perfectly, but this is what I'm talking about today. however , in the later project modification, the需要加密的字符串Chinese characters are added (there is no Chinese characters in the string that need to be encrypted), In this case, the above method and the server side of the encryption不一样(difficult to debug the process of troubleshooting issues not to repeat);
The reason for the final discovery is that the encryption string generated on my side is服务器not the same as that generated there, and the error is naturally occurring because加密的字符串中包含有汉字
Then search online, in < topic: How to SHA1 encryption of Chinese strings > Find the method in this post, and now contribute to everyone
First you need to add the header file
#import <CommonCrypto / CommonDigest.h>
Then use the following method directly
// sha1 encryption method
-(NSString *) sha1: (NSString *) input
{
// const char * cstr = [input cStringUsingEncoding: NSUTF8StringEncoding];
// NSData * data = [NSData dataWithBytes: cstr length: input.length];
NSData * data = [input 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;
}
We can see the difference between this method and the first one, the first two sentences are commented out, and the
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
Instead of the effect of the two sentences;
Posts on the first floor bindbasic The exact same thing.
Using the above method to convert Chinese strings to data will cause data loss.
Put
const char * cstr = [input cStringUsingEncoding: NSUTF8StringEncoding];
NSData * data = [NSData dataWithBytes: cstr length: input.length];
These two sentences are changed to
NSData * data = [input dataUsingEncoding: NSUTF8StringEncoding];
Just fine
After the actual measurement, the encryption method of the second method is suitable for pure strings and strings with Chinese characters. It is recommended, recommended, recommended! ! ! (Important thing said three times)
Note: Strictly speaking,SHA1 (security [hashing algorithm]) is just called an algorithm, for Verify data integrity, and not called加密~
RELATED links:
IOS SHA1 encryption Method (hash algorithm, used to verify data integrity) and encryption methods for cases in which characters are contained in a string
Introduction to MD5 and SHA-1 encryption (with iOS encryption)
How HMAC_SHA1 is decrypted in iOS
Implementation of the OBJECTIVE-C MD5/SHA1 encryption algorithm for iOS development
IOS SHA1 Encryption algorithm