Souci sur un Hashage HMAC

StephSteph Membre
août 2012 modifié dans Objective-C, Swift, C, C++ #1
Salut,



J'ai un souci sur un hachage HMAC, que je dois utiliser pour communiquer avec une API.



Voila le code de la méthode de hash :




<br />
+(NSString *) hash_hmac:(NSString *)args forKey:(NSString *)key {<br />
	<br />
	const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];<br />
	const char *cData = [args cStringUsingEncoding:NSUTF8StringEncoding];<br />
	<br />
	unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];<br />
	<br />
	CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);<br />
	<br />
	NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC<br />
										  length:sizeof(cHMAC)];<br />
	<br />
	NSString *hash = [[NSString alloc] initWithData:HMAC encoding:NSASCIIStringEncoding];<br />
<br />
	return hash;<br />
<br />
	[hash release];<br />
}<br />




Pour faire un hash, ça hash, mais les valeurs retournées sont bizarres, genre :




hash = &quot;OL\U00b7\U0099\U00ca\U00e1\U00aa(\U009d\U00e8`\U00bfK\U00f9\U00a7\U008dd\U00c2\U009e\U00cd\U008f\U00cf\U00fb~\U00a1S\U00bax&quot;;




Je me demande si ce n'est pas à  cause de l'ASCII, et peut-être plutôt utiliser une base64 pour l'encodage de la NSString, mais je ne trouve pas comment faire.



Une idée?



Thanks

Réponses

  • Tu as essayé avec NSUTF8StringEncoding?
  • Ouais ça me retourne nil et ça crash l'app.



    Je ne trouve rien qui marche sur Google, et la RFC ne m'aide pas vraiment image/sad.png' class='bbc_emoticon' alt=':(' />
  • Il y a un gars qui dit qu'il a fait ça :


    <br />
    NSString *key=@”Your secret Key”;<br />
    NSString *data= @”Your Data Here”<br />
    const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];<br />
    const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];<br />
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];<br />
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);<br />
    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC<br />
    length:sizeof(cHMAC)];<br />
    NSString *hash = [HMAC base64Encoding];<br />
    [HMAC release];<br />




    Sauf que :


    <br />
    NSString *hash = [HMAC base64Encoding];<br />




    base64Encoding est inconnu au bataillon.
  • Tu as un article intéressant sur les base64



    voir http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html
  • Merci image/smile.png' class='bbc_emoticon' alt=':)' />



    En fait mes informations sont fausses, j'avais converti en base64 et le résultat était bon, mais en fait il me faut de l'hex.



    Je cherche donc comment convertir une chaà®ne ASCII en hex.
  • Problème résolu image/smile.png' class='bbc_emoticon' alt=':)' />



    Donc il me faut bien du hex, donc voilà  une category qui converti du NSData en hex :



    NSData+Conversion.h


    <br />
    #import &lt;Foundation/Foundation.h&gt;<br />
    @interface NSData (NSData_Conversion)<br />
    #pragma mark - String Conversion<br />
    - (NSString *)hexadecimalString;<br />
    @end<br />




    NSData+Conversion.m


    <br />
    #import &quot;NSData+Conversion.h&quot;<br />
    @implementation NSData (NSData_Conversion)<br />
    #pragma mark - String Conversion<br />
    - (NSString *)hexadecimalString {<br />
        /* Returns hexadecimal string of NSData. Empty string if data is empty.   */<br />
       <br />
        const unsigned char *dataBuffer = (const unsigned char *)[self bytes];<br />
       <br />
        if (&#33;dataBuffer)<br />
    	    return [NSString string];<br />
       <br />
        NSUInteger		  dataLength  = [self length];<br />
        NSMutableString	 *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];<br />
       <br />
        for (int i = 0; i &lt; dataLength; ++i)<br />
    	    [hexString appendString:[NSString stringWithFormat:@&quot;%02lx&quot;, (unsigned long)dataBuffer[i]]];<br />
       <br />
        return [NSString stringWithString:hexString];<br />
    }<br />
    @end<br />




    Ma méthode ressemble donc à  ça maintenant :


    <br />
    +(NSString *) hash_hmac:(NSString *)args forKey:(NSString *)key {<br />
       <br />
        const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];<br />
        const char *cData = [args cStringUsingEncoding:NSUTF8StringEncoding];<br />
       <br />
        unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];<br />
       <br />
        CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);<br />
       <br />
        NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC<br />
    										  length:sizeof(cHMAC)];<br />
       <br />
        NSString *hash = [HMAC hexadecimalString];<br />
       <br />
        return hash;<br />
       <br />
        [hash release];<br />
       <br />
    }<br />




    Si ça peut servir à  quelqu'un, c'est kdo image/smile.png' class='bbc_emoticon' alt=':)' />
Connectez-vous ou Inscrivez-vous pour répondre.