2010-09-30 52 views
21

Tôi đang phát triển chức năng đăng nhập cho Ứng dụng iPhone của mình, vì vậy tôi muốn băm mật khẩu bằng thuật toán băm SHA512 sau đó nhận kết quả là NSString (kết quả sẽ giống với SHA512 trong C#). Sau khi dành rất nhiều thời gian trên internet, tôi vẫn chưa tìm ra giải pháp nào! :(băm chuỗi mật khẩu sử dụng SHA512 như C#

Có ai có giải pháp và mẫu mã, hãy giúp tôi! Thanks a lot!

[Cập nhật] Trong mã của tôi # C, mật khẩu được lưu trữ sử dụng SecureString, như vậy có lẽ đó là nguyên nhân làm cho . mảng byte khác nhau giữa mục tiêu-c và C#

Trả lời

30

chức năng này sẽ băm một chuỗi sử dụng SHA512 chuỗi kết quả là một đại diện hex của băm:

+ (NSString *) createSHA512:(NSString *)source { 

    const char *s = [source cStringUsingEncoding:NSASCIIStringEncoding]; 

    NSData *keyData = [NSData dataWithBytes:s length:strlen(s)]; 

    uint8_t digest[CC_SHA512_DIGEST_LENGTH] = {0}; 

    CC_SHA512(keyData.bytes, keyData.length, digest); 

    NSData *out = [NSData dataWithBytes:digest length:CC_SHA512_DIGEST_LENGTH]; 

    return [out description]; 
} 

Đừng quên bao gồm The Corre ct tiêu đề:

#include <CommonCrypto/CommonDigest.h> 
+0

Oh, cảm ơn bạn rất nhiều, tôi sẽ thử nó ngay bây giờ! –

+0

Kính gửi Philippe, nó hoạt động tốt, cảm ơn! –

+0

Thưa Philippe, tôi gặp vấn đề khi so sánh mật khẩu băm khác nhau giữa C# và mục tiêu-c. Trong mã C# của tôi, tôi đã sử dụng SecureString để lưu trữ mật khẩu, vì vậy tôi phải sử dụng Marshal Copy để lấy mảng byte và tôi thấy rằng có 0bytes được nối sau mỗi mật khẩu của char, có thể đó là nguyên nhân khiến mật khẩu băm khác nhau. Tôi không biết làm thế nào để giải quyết nó, bạn có thể vui lòng giúp tôi một lần nữa? cảm ơn! –

18

Tôi đang sử dụng cái này.

Nó phù hợp PHP SHA512 thuật toán đầu ra:

<?php `hash('sha512', 'The quick brown fox jumped over the lazy dog.');` ?> 


Objective-C mã:

+(NSString *)createSHA512:(NSString *)string 
{ 
    const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:string.length]; 
    uint8_t digest[CC_SHA512_DIGEST_LENGTH]; 
    CC_SHA512(data.bytes, data.length, digest); 
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2]; 

    for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) 
     [output appendFormat:@"%02x", digest[i]]; 
    return output; 
} 
+1

+1 Tính năng này hoạt động tốt hơn cho tôi. sản lượng của câu trả lời là không mong muốn để so sánh php: <9870d986 f510384d 932cdff5 13fb1886 0eee6d6f 1e90e794 bd25b980 bd0a48d1 d5fdd937 f454408f e93f5a61 e8724993 0e153424 41a24f9f 3059a9ea 3e029f2a> Trong trường hợp như thế này đầu ra câu trả lời cái gì đó như: 9870d986f510384d932cdff513fb18860eee6d6f1e90e794bd25b980bd0a48d1d5fdd937f454408fe93f5a61e87249930e15342441a24f9f3059a9ea3e029f2a – capikaw

+2

tại sao bạn phải nhân cho 2 về sản lượng: CC_SHA512_DIGEST_LENGTH * 2? –

+1

@SisterRay Như tên của nó, nó là 512 bit, tức là 64 byte. Nhưng đó là băm, có lẽ bạn đang tự hỏi về một đại diện cụ thể của băm đó trong chuỗi, như thường được sử dụng, sau đó nó phụ thuộc vào đại diện nhất định. Nếu bạn viết băm trong hexa, thì nó sẽ là 128 ký tự. Nếu bạn viết băm trong base64, sau đó nó sẽ là 86 byte (hoặc 88 với đệm). – Wingzero

Các vấn đề liên quan