2009-01-24 8 views
14

Para todas las operaciones con servicios de Amazon (S3, EC2, SimpleDB) Debe firmar todas las resquisiciones con firma HMAC-SHA-1 (http://en.wikipedia.org/wiki/HMAC, http://docs.amazonwebservices.com/AWSFWS/latest/DeveloperGuide/index.html?SummaryOfAuthentication.html).¿Hay una biblioteca para iPhone que funcione con la codificación HMAC-SHA-1?

Estoy trabajando en el back-end asp.net y no hay ningún problema. El problema está en la aplicación de iPhone. El desarrollador de iPhone dice que no hay forma de usar la codificación HMAC-SHA-1, y no tiene ningún derecho para implementar su propio algoritmo. Como programador, no puedo entender por qué puede haber un problema.

Así que quiero saber también es desarrollador de iPhone ¿verdad?

Nunca he codificado para iPhone, así que ni siquiera dónde buscar dicha información.

+1

Así que básicamente su desarrollador de iPhone está equivocado ... – schwa

Respuesta

0

No sé si este es el caso, pero antes había restricciones en los algoritmos de encriptación y su derecho a distribuirlos a ciertos países estaba restringido.

Si este sigue siendo el caso, es posible que Apple no quiera/no pueda restringir la descarga de ciertas aplicaciones en estos países.

2

No para iPhone en particular, pero la biblioteca libs3 proporciona una API C para acceder a los servicios S3 de Amazon. Esto, o el componente FUSE s3fs, puede ser una buena fuente para extraer las rutinas necesarias para comunicarse con los servicios web de Amazon. Como Objective-C sigue siendo C en su núcleo, estas rutinas deberían funcionar perfectamente en el iPhone.

Conozco al menos a un desarrollador que está usando algo similar dentro de su aplicación de iPhone para comunicarse con los segmentos S3.

+0

¡Hola! ¿Y trabajaste con libs3? – Hate

2

Creo que la biblioteca CommonCrypto hará lo que quiera. Mira a este archivo:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/include/CommonCrypto/CommonHMAC.h

14

CommonCrypto hace el truco.

#import <CommonCrypto/CommonHMAC.h> 

luego

/* 
    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]; 
+1

. Esta puede ser una pregunta simple ... Para convertir el * fuera, podría usar algo como [[NSString alloc] initWithData: codificación de salida: NSUTF8StringEncoding];? –

+1

así como así. puede ver http://github.com/soundcloud/cocoa-api-wrapper/blob/b9e73f9cba5eec1dec9ac650d7059cc9ce23c76d/SoundCloudAPI/Outsourced/OAuthConsumer/OAHMAC_SHA1SignatureProvider.m para obtener un ejemplo de la vida real. – stigi

4

Un poco de googling y me encontré this document.

exportación de SHA1 está sujeto a controles exportación (Estados Statese) del Gobierno Federal y los exportadores están aconsejó ponerse en contacto con el Departamento de Comercio , Oficina de Administración de Exportación para más información.

También encontré this:

República Popular de China y la antiguo bloque soviético puede importar SHA como siempre y cuando se pretende para los civiles aplicaciones de usuario final y no para fines militares. Los siguientes países están prohibidos en importando SHA: Cuba, Irán, Iraq, Libia, Corea del Norte, Serbia, Siria y Sudán. Tenga en cuenta que esta lista de países de embargo cambia con el tiempo.

(No es una respuesta directa a su pregunta, pero sin duda pertinente.)

5

Este article demuestra un poco de la función que va a generar un hash SHA-1 compendio que coincida con lo que el sha1() de PHP la función se generará si le da la misma entrada:

#import <CommonCrypto/CommonDigest.h> 

@implementation SHA1 

+(NSString*) digest:(NSString*)input 
{ 
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; 
NSData *data = [NSData dataWithBytes:cstr length:input.length]; 

uint8_t digest[CC_SHA1_DIGEST_LENGTH]; 

CC_SHA1(data.bytes, data.length, digest); 

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

for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) 
[output appendFormat:@"%02x", digest[i]]; 

return output; 

} 
@end 
+1

SHA-1 no es lo mismo que HMAC-SHA-1. –

+0

La conversión implícita pierde la precisión de enteros (NSUInteger a CC_LONG) – Jonny

Cuestiones relacionadas