2011-02-14 97 views
12

可能重複:
Sha256 in Objective-C for iPhone生成SHA256字符串的目標C

問候,

我有可怕的麻煩發生在Objective C的一個SHA256字符串(可能是因爲我對語言來說,這是如此的新鮮)。

在jQuery中,我必須做的是這樣的:

var sha256String=$.sha256("Hello"); 

產生的散列預期。

但是在Objective-C,我已經試過以下無濟於事:

NSString *pword=[[NSString alloc] 
initWithString:login_pword.text]; 
unsigned char result[64]; 
CC_SHA256([pword UTF8String], [pword lengthOfBytesUsingEncoding:NSASCIIStringEncoding],result); 
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:result delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
[msg show]; 
[msg release]; 

有一些功能,我可以打電話如:

NSString *sha256String=[self getSHA256:pword]; 

這是我米試圖創造,我覺得它非常困難!

我希望有人能幫忙。

非常感謝,

+3

我當然希望你不要期望Javascript和Objective-C之間有任何行爲上的相似之處。 – 2011-02-14 12:26:06

+0

我已經看過那個線程了,謝謝。我試圖返回sha256字符串。 – Eamorr 2011-02-14 12:28:17

+2

鏈接的問題不是完全重複的。投票重新開放。 – 2011-04-30 00:28:22

回答

3

您正在將result轉換爲UIAlertViewinit方法。 resultchar[],而UIAlertView預計爲NSString*。您需要將char[]轉換爲NSString *

試試這個:

NSString *resultString = [NSString stringWithCString:result encoding:NSASCIIStringEncoding]; 
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

也可參閱散列在iPhone上this文章。

1

您將需要使用OpenSSL C函數。有關如何做到這一點,請參閱this question。作爲輸入字符串,您將使用長度爲[myString lengthOfBytesUsingEncoding:NSUTF8StringEncoding][myString UTFString]

53

今天多打轉轉後,我終於想出了一個函數來獲取SHA256:

-(NSString*) sha256:(NSString *)clear{ 
    const char *s=[clear cStringUsingEncoding:NSASCIIStringEncoding]; 
    NSData *keyData=[NSData dataWithBytes:s length:strlen(s)]; 

    uint8_t digest[CC_SHA256_DIGEST_LENGTH]={0}; 
    CC_SHA256(keyData.bytes, keyData.length, digest); 
    NSData *out=[NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH]; 
    NSString *hash=[out description]; 
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""]; 
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""]; 
    return hash; 
} 

這使得輸出作爲PHP相同。它可以輕鬆轉換爲SHA1 - 只需將「SHA256」更改爲「SHA1」即可。

希望它可以幫助別人。