SHA1 hash producing different result in Objective-C and C#.NET

前端 未结 2 1184
醉梦人生
醉梦人生 2021-02-11 07:56

Basically I want to write function that computes sha1 hash.

So far I have tried is as follows.

C#.NET

byte[] p2 = System.Text.En         


        
相关标签:
2条回答
  • 2021-02-11 08:49

    This line is wrong, since you interpret UTF8 encoded data as if it was Unicode encoded:

    NSString *unicodePassword = [[NSString alloc] initWithData:data encoding:NSUnicodeStringEncoding];

    Replce the second line with: NSData *data = [password dataUsingEncoding:NSUnicodeStringEncoding];

    The 2 first bytes in data is a BOM (Byte order mark).

    Remove these 2 bytes with data = [NSData dataWithBytes:[data bytes] + 2 length:[data length] - 2];

    ...and then hash that data any you will have the same hash as in C#.

    0 讨论(0)
  • 2021-02-11 09:01

    For further information I found that SHA1 function can have some results..

    So I have implemented methods at this link: MD5 and SHA1 iOS implementation linked by this stackoverflow question

    and I refine it with my integration that send as parameters if you send UTF8-encoding string or not (unicode one) and if you want hexadecimal string or decimal one

    - (NSString*) sha1UTF8Encoding:(BOOL)utf8 andDecimal:(BOOL)decimal
    {
        const char *cstr;
        if (utf8) {
            cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
        }else{
            cstr = [self cStringUsingEncoding:NSUnicodeStringEncoding];
        }
        NSData *data = [NSData dataWithBytes:cstr length:self.length];
    
        uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    
        CC_SHA1(data.bytes, data.length, digest);
    
        NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
        for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++){
            if (decimal) {
                [output appendFormat:@"%i", digest[i]];
            }else{
                [output appendFormat:@"%02x", digest[i]];
            }
        }
    
        return output;    
    }
    

    (Note that I implemented this method in a NSString Category)

    With this I tested that you can use it for many purpose sha1 operation, for example with this configuration:

    NSString* sha1 = [stringToTest sha1UTF8Encoding:YES andDecimal:YES];
    

    sha1 variable match with the one product by the C# method found at this link: Hashing using the SHA1 class

    0 讨论(0)
提交回复
热议问题