2009-04-09 17 views
6

estoy tratando de llamar al servicio web de Amazon y estoy atascado en obtener la firma, miré esto pero todavía tengo una pregunta sobre ello.codificación de iPhone y HMAC-SHA-1

utilizando este ejemplo de lo que es la

NSData *keyData; 
NSData *clearTextData 

? ¿Qué necesito pasar para estos dos valores?

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

Respuesta

5

Si llama al servicio web Amazon también mirar hacia arriba los precios o detalles del producto, se desactivará la clave de servicio web de Amazon y su aplicación dejará de funcionar .

mirada a las condiciones de servicio de los servicios web de Amazon, su uso por los clientes móviles está estrictamente anulado:

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

me encontré con esto de la manera difícil cuando mi solicitud había mi llave AWS deshabilitado en una aplicación de producción. Había leído los TDS, pero en realidad no estaba allí, como puede ver en el enlace de arriba a algún otro detalle de uso oscuro. No creo que el programa de afiliados tenga nada que ver con la API, pero lo hace.

Puede encontrar detalles de otras aplicaciones bloqueadas en este artículo de TechCrunch:

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

Sólo le da una mano a mano y es de esperar que le ahorra mucho trabajo.

+0

¿Dónde dice que "el uso por parte de los clientes móviles está estrictamente prohibido" http://aws.amazon.com/agreement/? – jeff7091

+0

Sé por la experiencia real de usar AWS y que Amazon revoque mi clave de una aplicación de producción. Me las arreglé para encontrar la cláusula una vez, pero no puedo encontrarla otra vez - molestamente no estaba en AWS TOS con los que te vinculaste (lo había leído antes de empezar a desarrollar) –

+0

Agregué enlaces con más detalles que demostraban mi punto . ¿Alguien se preocupa por eliminar el voto negativo ya que, de hecho, soy útil y no engañoso después de todo? –

0

Publiqué una solución para este here, que devuelve los datos codificados de Base64 que las solicitudes de AWS.

33

Acabo de pasar 4 horas en Google buscando formas de calcular un SHA1 no marcado en el iPhone que coincida con los resultados de la función sha1() en php. Aquí fue el resultado:

#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 

Esperamos que esto ayudará a otros que están luchando con SHA1 en el iPhone

+0

Esto me ayudó mucho. ¡Gracias! ¡Publiqué mi código también! – Eonil

+0

magnífico trabajo !!!! –

+0

¡esto es tan asombroso!Solo tardé entre 30 minutos y una hora de búsqueda en Google para encontrar esto (a diferencia de 4) ¡¡así que muchas gracias !! :) – 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

Implementé su método tipo de. Usé SHA512 en su lugar. Ahora mi pregunta es cómo enviar el hash de autenticación al servidor. Inicialicé un NSString con los datos del hash. Pero consiste en tantos interrogantes al revés, que no creo que esto salga bien. ¿Puedo enviar los datos brutos? –

+0

@Julian encrypted data es binario por defecto. Tienes que poder enviar datos binarios. Esto significa que su protocolo de comunicación debe admitir la transferencia de datos binarios. Si solo admite datos de texto (como encabezados HTTP sin formato), debe * codificar * datos binarios en cadena. La elección trivial es 'BASE64' o codificación de código hexadecimal que está bien definida y es ampliamente utilizada. – Eonil

+0

Algunos lenguajes carece de capacidad para manejar datos binarios. Por lo general, devuelve Cualquier implementación que devuelve cadena en lugar de binario en realidad realiza esa codificación antes del retorno. De todos modos, generalmente definen cómo lo codifican, así que consulte la especificación del idioma para el método de codificación específico. – Eonil

0

biblioteca de desarrollador de iOS de Apple ha proporcionado una excelente muestra titulada CryptoExercise que incluye una función simple :

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

se puede ver this tal vez ayude eres tú

+0

En lugar de solo proporcionar un enlace, [sería preferible] (http://meta.stackexchange.com/a/8259) incluir las partes esenciales de la respuesta aquí, y solo proporcione el enlace para referencia adicional. Si no está preparado para esta tarea, debería considerar simplemente [dejar un comentario] (http://stackoverflow.com/privileges/comment) en la pregunta en lugar de publicar una respuesta. – Dukeling