2009-04-09 14 views
6

sto cercando di ottenere una chiamata al servizio web Amazon e sono bloccato a ottenere la firma, guardato questo, ma ho ancora una domanda su di esso.Codifica iPhone e HMAC-SHA-1

utilizzando questo esempio quello che è il

NSData *keyData; 
NSData *clearTextData 

? cosa devo passare per questi due valori?

/* 
    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] 

risposta

5

Se si chiama il servizio web di Amazon anche guardare in alto i prezzi o dettagli del prodotto, sarà disabilitato il codice di servizio web di Amazon e la vostra applicazione smetterà di funzionare .

Guardate i termini di servizio di Amazon Web Services, l'utilizzo da parte dei client mobili è strettamente annullato:

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

Ho trovato questo nel modo più duro quando la mia domanda era la mia chiave AWS disabilitato nel un'app di produzione. Avevo letto il TOS, ma non era proprio lì come puoi vedere dal link sopra ad altri dettagli oscuri di utilizzo. Non penseresti che il programma di affiliazione abbia nulla a che fare con l'API, ma lo fa.

È possibile trovare i dettagli di altre applicazioni bloccate a questo articolo di TechCrunch:

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

solo dando un testa a testa e, auspicabilmente, risparmiando un sacco di lavoro.

+0

Dove si dice "l'utilizzo da parte dei client mobili è severamente vietato" http://aws.amazon.com/agreement/? – jeff7091

+0

Conosco l'esperienza effettiva dell'utilizzo di AWS e la revoca della chiave da un'app di produzione Amazon. Sono riuscito a trovare la clausola una volta, ma non riesco a trovarla di nuovo - fastidiosamente non era nel TOS AWS a cui ti sei collegato (avevo letto prima che iniziassi a sviluppare) –

+0

Ho aggiunto link con maggiori dettagli dimostrando il mio punto . Qualcuno si preoccupa di rimuovere il downvote poiché sono in realtà utile e non fuorviante, dopo tutto? –

0

Ho inviato una soluzione a questo here, che restituisce i dati codificati Base64 richiesti da AWS.

33

Ho appena trascorso 4 ore su Google e ho cercato modi per calcolare un SHA1 non registrato sull'iPhone che corrispondesse ai risultati della funzione sha1() in php. Qui è stato il risultato:

#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 

Speriamo che questo aiuterà gli altri che stanno lottando con SHA1 su iPhone

+0

Questo mi ha aiutato molto. Grazie! Ho pubblicato anche il mio codice! – Eonil

+0

magnifico lavoro !!!! –

+0

questo è così fantastico!mi ci sono voluti solo 30 minuti a un'ora o giù di google per trovare questo (al contrario di 4) quindi grazie mille !! :) – 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

Ho implementato il metodo in uso. Ho usato SHA512 invece. Ora la mia domanda è come inviare l'hash di autenticazione al server. Ho inizializzato una NSString con i dati dell'hash. Ma consiste in tanti punti interrogativi a testa in giù, che non credo che andrà bene. Posso inviare i dati grezzi? –

+0

@Julian dati crittografati è binario per impostazione predefinita. Devi essere in grado di inviare dati binari. Ciò significa che il protocollo di comunicazione dovrebbe supportare il trasferimento di dati binari. Se supporta solo dati di testo (come semplici intestazioni HTTP), è necessario * codificare * dati binari in stringa. La scelta banale è la codifica 'BASE64' o hex-code che è ben definita e ampiamente utilizzata. – Eonil

+0

Alcune lingue non hanno la capacità di gestire i dati binari di solito restituisce Qualsiasi implementazione che restituisce una stringa invece di binario esegue effettivamente tale codifica prima del ritorno. In ogni caso, solitamente definiscono in che modo lo codificano, quindi fai riferimento alle specifiche del linguaggio per un metodo di codifica specifico. – Eonil

0

biblioteca sviluppatore iOS di Apple ha fornito un campione eccellente intitolato CryptoExercise che include una funzione semplice :

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

si può vedere this forse aiutare sei tu.

+0

Invece di fornire un collegamento, [sarebbe preferibile] (http://meta.stackexchange.com/a/8259) includere le parti essenziali della risposta qui, e basta fornire il link per riferimento aggiuntivo. Se non sei all'altezza di questo compito, dovresti considerare semplicemente [lasciando un commento] (http://stackoverflow.com/privileges/comment) sulla domanda invece di pubblicare una risposta. – Dukeling