2010-09-30 12 views
21

का उपयोग कर पासवर्ड स्ट्रिंग है, मैं अपने आईफोन एप्लिकेशन के लिए लॉगऑन फ़ंक्शन विकसित कर रहा हूं, इसलिए मैं SHA512 हैशिंग एल्गोरिदम का उपयोग करके पासवर्ड रखना चाहता हूं, फिर परिणाम को एनएसएसटींग के रूप में प्राप्त करें (परिणाम सी # 5 में SHA512 के साथ होना चाहिए)। इंटरनेट में बहुत समय बिताने के बाद, मुझे अभी भी समाधान नहीं मिला है! :(हैश को SHA512 जैसे C#

क्या कोई समाधान और नमूना कोड है है, मेरी मदद कृपया! धन्यवाद एक बहुत!

[अपडेट] मेरी सी # कोड में, पासवर्ड, SecureString का उपयोग कर संग्रहीत किया जाता है तो शायद यह है कारण बना । ऑब्जेक्टिव-सी और सी #

उत्तर

30

इस समारोह SHA512 का उपयोग कर एक स्ट्रिंग हैश जाएगा के बीच अलग अलग बाइट सरणी जिसके परिणामस्वरूप स्ट्रिंग हैश का एक हेक्स प्रतिनिधित्व है:

+ (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]; 
} 

मत भूलना corre शामिल करने के लिए सीटी हेडर:

#include <CommonCrypto/CommonDigest.h> 
+0

ओह, धन्यवाद आप, मैं अभी की कोशिश करेंगे! –

+0

प्रिय फिलिप, यह अच्छी तरह से काम कर रहा है, धन्यवाद! –

+0

प्रिय फिलिप, मुझे एक समस्या है कि हैश पासवर्ड की तुलना करते समय सी # और उद्देश्य-सी के बीच अलग हैं। मेरे सी # कोड में, मैंने पासवर्ड स्टोर करने के लिए सिक्योरस्ट्रिंग का उपयोग किया, इसलिए मुझे बाइट सरणी प्राप्त करने के लिए मार्शल कॉपी का उपयोग करना पड़ा और मैंने देखा कि प्रत्येक पासवर्ड के चार के बाद 0bytes संलग्न हैं, शायद यही कारण है कि हैश पास अलग हैं। मुझे नहीं पता कि इसे कैसे हल किया जाए, क्या आप कृपया मेरी मदद कर सकते हैं? धन्यवाद! –

18

मैं इसका उपयोग कर रहा हूं।

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


ऑब्जेक्टिव-सी कोड:

यह PHP SHA512 एल्गोरिथ्म उत्पादन से मेल खाता है इतना

+(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 यह मेरे लिए बेहतर काम करता है। जवाब के उत्पादन php तुलना के लिए अवांछनीय है: <9870d986 f510384d 932cdff5 13fb1886 0eee6d6f 1e90e794 bd25b980 bd0a48d1 d5fdd937 f454408f e93f5a61 e8724993 0e153424 41a24f9f 3059a9ea 3e029f2a> कहाँ के रूप में की तरह इस जवाब आउटपुट कुछ: 9870d986f510384d932cdff513fb18860eee6d6f1e90e794bd25b980bd0a48d1d5fdd937f454408fe93f5a61e87249930e15342441a24f9f3059a9ea3e029f2a – capikaw

+2

तुम क्यों उत्पादन में 2 के लिए गुणा करने की क्या ज़रूरत है: CC_SHA512_DIGEST_LENGTH * 2? –

+1

@SisterRay जैसा कि नाम का तात्पर्य है, यह 512 बिट्स है, जो 64 बाइट्स है। लेकिन यह हैश है, हो सकता है कि आप स्ट्रिंग में उस हैश के विशिष्ट प्रतिनिधित्व के बारे में सोच रहे हों, जैसा आमतौर पर उपयोग किया जाता है, तो यह दिए गए प्रतिनिधित्व पर निर्भर करता है। यदि आप हैक्स में हैश लिखते हैं, तो यह 128 वर्ण होंगे। यदि आप बेस 64 में हैश लिखते हैं, तो यह 86 बाइट्स (या पैडिंग के साथ 88) होगा। – Wingzero

संबंधित मुद्दे