2009-04-09 8 views
6

J'essaie d'obtenir un appel au service Web Amazon et je suis resté sur la signature, j'ai regardé cela mais j'ai encore une question à ce sujet.iPhone et encodage HMAC-SHA-1

utilisant cet exemple ce qui est le

NSData *keyData; 
NSData *clearTextData 

? que dois-je faire pour ces deux valeurs?

/* 
    inputs: 
    NSData *keyData; 
    NSData *clearTextData 
*/ 

uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0}; 

CCHmacContext hmacContext; 
CCHmacInit(&hmacContext, kCCHmacAlgSHA1, keyData.bytes, keyData.length); 
CCHmacUpdate(&hmacContext, clearTextData.bytes, clearTextData.length); 
CCHmacFinal(&hmacContext, digest); 

NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH] 

Répondre

5

Si vous appelez le service Web Amazon semble trop augmenter les prix ou les détails du produit, la clé de votre service Web Amazon sera désactivé et votre application cessera de fonctionner .

Regardez les conditions de service des services Web Amazon, l'utilisation par les clients mobiles est strictement refusée:

https://affiliate-program.amazon.com/gp/advertising/api/detail/agreement.html

Je trouve cela à la dure quand ma propre application avait ma clé AWS désactivé sur une application de production. J'avais lu les TOS, mais ce n'était pas vraiment là comme vous pouvez le voir par le lien ci-dessus à un autre détail obscur de l'utilisation. Vous ne penseriez pas que le programme d'affiliation aurait quelque chose à voir avec l'API, mais c'est le cas.

Vous trouverez tous les détails des autres applications bloquées à cet article TechCrunch:

http://www.techcrunch.com/2009/07/07/amazon-killing-mobile-apps-that-use-its-data/

vous donne juste un heads-up et nous espérons que vous sauver beaucoup de travail.

+0

Où dit-on "l'utilisation par les clients mobiles est strictement interdite" http://aws.amazon.com/agreement/? – jeff7091

+0

Je sais de l'expérience réelle de l'utilisation de l'AWS et avoir Amazon révoquer ma clé à partir d'une application de production. J'ai réussi à trouver la clause une fois, mais je ne peux pas le trouver à nouveau - ennuyeusement ce n'était pas dans l'AWS TOS vous avez lié (j'avais lu avant que je ai même commencé à développer) –

+0

J'ai ajouté des liens avec plus de détails prouvant mon point . Quelqu'un se soucie-t-il de supprimer le downvote puisque je suis en fait utile et non trompeur après tout? –

0

J'ai posté une solution à cette here, qui renvoie les données codées en base 64 que demande AWS.

33

Je viens de passer 4 heures à googler et à chercher des moyens de calculer un SHA1 non-clé sur l'iPhone qui correspondrait aux résultats de la fonction sha1() en php. Il y avait là le résultat:

#import <CommonCrypto/CommonDigest.h> 

    NSString *hashkey = <your data here>; 
// PHP uses ASCII encoding, not UTF 
const char *s = [hashkey cStringUsingEncoding:NSASCIIStringEncoding]; 
NSData *keyData = [NSData dataWithBytes:s length:strlen(s)]; 

// This is the destination 
uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0}; 
// This one function does an unkeyed SHA1 hash of your hash data 
CC_SHA1(keyData.bytes, keyData.length, digest); 

// Now convert to NSData structure to make it usable again 
NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_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 

Espérons que cela aidera d'autres qui sont aux prises avec SHA1 sur l'iPhone

+0

Cela m'a beaucoup aidé. Merci! J'ai posté mon code aussi! – Eonil

+0

magnifique travail !!!! –

+0

c'est tellement génial!Il ne m'a fallu que 30 minutes à une heure de googling pour trouver ceci (par opposition à 4), donc merci une tonne !! :) – taber

2
// This is my code used in my Twitter connection, and working well for me. 
// KeithF's code was a big help! 
// 
// This is a category added to NSData. 

@implementation NSData (EOUtil) 
- (NSData*)dataByHmacSHA1EncryptingWithKey:(NSData*)key 
{ 
    void* buffer = malloc(CC_SHA1_DIGEST_LENGTH); 
    CCHmac(kCCHmacAlgSHA1, [key bytes], [key length], [self bytes], [self length], buffer); 
    return [NSData dataWithBytesNoCopy:buffer length:CC_SHA1_DIGEST_LENGTH freeWhenDone:YES]; 
} 
@end 
+0

J'ai implémenté votre méthode de type. J'ai utilisé SHA512 à la place. Maintenant, ma question est de savoir comment envoyer le hachage d'authentification au serveur. J'ai initialisé un NSString avec les données du hachage. Mais il se compose de tant de points d'interrogation à l'envers, que je ne crois pas que cela se passera bien. Puis-je envoyer les données brutes? –

+0

@Julian données cryptées est binaire par défaut. Vous devez être capable d'envoyer des données binaires. Cela signifie que votre protocole de communication doit prendre en charge le transfert de données binaires. S'il ne prend en charge que les données de texte (telles que les en-têtes HTTP), vous devez * encoder * les données binaires en chaîne. Le choix trivial est le codage 'BASE64' ou codage hexadécimal qui est bien défini et largement utilisé. – Eonil

+0

Certaines langues n'ont pas la capacité de gérer les données binaires retourne généralement Toute implémentation qui renvoie une chaîne au lieu de binaire est en fait effectuer ce codage avant le retour. Quoi qu'il en soit, ils définissent généralement comment ils l'encodent, donc référez-vous à la spécification de la langue pour la méthode de codage spécifique. – Eonil

0

bibliothèque de développeur iOS d'Apple a fourni un excellent échantillon intitulé CryptoExercise qui comprend une fonction simple :

- (NSData *)getHashBytes:(NSData *)plainText" to get a SHA-1 hash. 
-1

Vous pouvez voir this peut-être aider s vous.

+0

Plutôt que de simplement fournir un lien, [il serait préférable] (http://meta.stackexchange.com/a/8259) d'inclure les parties essentielles de la réponse ici, et juste fournir le lien pour référence supplémentaire. Si vous n'êtes pas à la hauteur de cette tâche, vous devriez considérer simplement [laisser un commentaire] (http://stackoverflow.com/privileges/comment) sur la question au lieu de poster une réponse. – Dukeling