c एचएमएसी-एसएचए 1 के लिए उद्देश्य-सी नमूना कोड




objective-c sha1 (7)

यहां बताया गया है कि आप SHA-256 का उपयोग करके एचएमएसी कैसे उत्पन्न करते हैं:

NSString *key;
NSString *data;

const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
                                      length:sizeof(cHMAC)];

NSString *hash = [HMAC base64Encoding];

मुझे एक हॉट लाइब्रेरी से अवगत नहीं है, लेकिन अगर मैं सही ढंग से याद करता हूं तो एल्गोरिदम काफी सरल था।

मुझे उद्देश्य सी में एचएमएसी-एसएचए 1 उत्पन्न करने की जरूरत है, लेकिन मुझे कुछ भी नहीं मिला जो काम करता है। मैंने सीसीएचएमएसी का उपयोग करके कॉमनक्रिप्टो के साथ प्रयास किया, लेकिन काम नहीं किया। मुझे एचएमएसी उत्पन्न करने और एचओटीपी संख्या उत्पन्न करने की आवश्यकता है।

किसी के पास उद्देश्य सी या सी में कोई उदाहरण कोड है?


यह एक पूरा समाधान है जो बिना किसी अतिरिक्त पुस्तकालयों या हैक्स के काम करता है:

+(NSString *)hmac:(NSString *)plainText withKey:(NSString *)key
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [plainText cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSData *HMACData = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

    const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
    NSString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];

    for (int i = 0; i < HMACData.length; ++i)
        HMAC = [HMAC stringByAppendingFormat:@"%02lx", (unsigned long)buffer[i]];

    return HMAC;
}

आपको किसी भी तृतीय-पक्ष बेस 64 लाइब्रेरी को शामिल करने की आवश्यकता नहीं है क्योंकि यह पहले ही एन्कोड किया गया है।


हेक्स स्ट्रिंग लौटने वाली बाहरी फाइलों के बिना यह आप कैसे करते हैं:

-(NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];
    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
    const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
    NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
    for (int i = 0; i < HMACData.length; ++i){
        [HMAC appendFormat:@"%02x", buffer[i]];
     }
   return HMAC;
}

आईओएस 7 के साथ एक्सकोड 5 में इसका परीक्षण किया गया था और ठीक काम करता है!


यह http://cocoawithlove.com/2009/07/hashvalue-object-for-holding-md5-and.html से कुछ कोड का उपयोग करके कस्टम प्रोटोकॉल का उपयोग किए बिना काम करता है

HashSHA256.h

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>

@interface HashSHA256 : NSObject {


}

 - (NSString *) hashedValue :(NSString *) key andData: (NSString *) data ; 

@end

HashSHA256.m

#import "HashSHA256.h"

#import <CommonCrypto/CommonHMAC.h>


@implementation HashSHA256


- (NSString *) hashedValue :(NSString *) key andData: (NSString *) data {


    const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSString *hash;

    NSMutableString* output = [NSMutableString   stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", cHMAC[i]];
    hash = output;
    return hash;

}

@end

उपयोग:

- (NSString *) encodePassword: (NSString *) myPassword {
    HashSHA256 * hashSHA256 = [[HashSHA256 alloc] init];   
    NSString * result = [hashSHA256 hashedValue:mySecretSalt andData:myPassword];       
    return result;       
}

ब्याज से, आप क्यों बनाते हैं (हस्ताक्षरित चार सीएचएमएसी) और फिर (NSData) में कनवर्ट करते हैं और फिर इसे (एनएसएमयूटेबलस्ट्रिंग) में परिवर्तित करते हैं और फिर अंत में (हेक्सस्ट्रिंग) में परिवर्तित करते हैं?

आप इसे मध्यस्थ को काटकर (यानी एनएसडीटा और एनएसएमयूटेबल स्टिंगिंग के बिना, त्वरित और बेहतर प्रदर्शन के बिना), (बदलते चार) को बदलकर (uint8_t []) कर सकते हैं, आखिरकार वे सभी हेक्स-एरे हैं !, नीचे:

-(NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
{
const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];

uint8_t cHMAC[CC_SHA1_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSString *Hash1 = @"";
for (int i=0; i< CC_SHA1_DIGEST_LENGTH; i++)
{
    Hash1 = [Hash1 stringByAppendingString:[NSString stringWithFormat:@"%02X", cHMAC[i]]];
}
return Hash1;
}

आशा है कि ये आपकी मदद करेगा,

सादर

हीडर सती


यहां बताया गया है कि आप एचएमएसी-एसएचए 1 बेस 64 कैसे उत्पन्न कर सकते हैं।

आपको अपनी परियोजना में बेस 64.h और Base64.m जोड़ने की आवश्यकता है। आप इसे here से प्राप्त कर सकते here

यदि आप एआरसी का उपयोग करते हैं, तो यह Base64.m में कुछ त्रुटियों को दिखाएगा। ऐसी लाइनें खोजें जो इस तरह समान हैं

return [[[self alloc] initWithBase64String:base64String] autorelease];

आपको ऑटोरेलीज सेक्शन को हटाना है। अंतिम परिणाम इस तरह दिखना चाहिए:

return [[self alloc] initWithBase64String:base64String];

अब आपके सामान्य प्रोजेक्ट में "बेस 64.h" आयात करें और निम्न कोड

#import "Base64.h"
#include <CommonCrypto/CommonDigest.h>
#include <CommonCrypto/CommonHMAC.h>

- (NSString *)hmacsha1:(NSString *)data secret:(NSString *)key {

    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

    NSString *hash = [HMAC base64String];

    return hash;
}

साथ में

NSLog(@"Hash: %@", hash);  

आपको इस तरह कुछ मिल जाएगा:

ghVEjPvxwLN1lBi0Jh46VpIchOc=


मैं पूरे दिन बिताता हूं, जेनरेट किए गए हैश (बाइट्स) को पठनीय डेटा में बदलने की कोशिश करता हूं। मैंने उपरोक्त उत्तर से बेस 64 एन्कोडेड समाधान का उपयोग किया और यह मेरे लिए बिल्कुल काम नहीं किया (बीटीडब्ल्यू आपको चाहिए और बाहरी .h बेस 64 एन्कोडिंग का उपयोग करने में सक्षम होने के लिए)।

तो मैंने यह किया था (जो बाहरी के बिना पूरी तरह से काम करता है। एच):

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

// Now convert to NSData structure to make it usable again
NSData *out = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH];

// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
// hash is now a string with just the 40char hash value in it
NSLog(@"%@",hash);






hmac