Besoin de générer un hachage HMAC SHA256 en Objective C comme en Java
J'ai besoin de générer un hachage à l'aide de l'algorithme HMAC SHA256. Je suis en utilisant le code suivant dans Java. J'ai besoin d'un code équivalent en Objective-C.
javax.crypto.Mac mac = javax.crypto.Mac.getInstance(type);
javax.crypto.spec.SecretKeySpec secret = new javax.crypto.spec.SecretKeySpec(key.getBytes(), type);
mac.init(secret);
byte[] digest = mac.doFinal(value.getBytes());
StringBuilder sb = new StringBuilder(digest.length * 2);
String s="";
for (byte b: digest) {
s = Integer.toHexString(b);
if (s.length() == 1) {
sb.append('0');
}
sb.append(s);
}
return sb.toString();
Key = YARJSuwP5Oo6/r47LczzWjUx/T8ioAJpUK2YfdI/ZshlTUP8q4ujEVjC0seEUAAtS6YEE1Veghz+IDbNQb+2KQ==
Valeur =
id=456|time=19:10|nonce=8
De sortie =
4effffffd8ffffffce7cffffffc4ffffffc71b2f72ffffffdc21ffffffa1ffffffe0ffffffe62d32550b0771296bffffff9c1159ffffffdeffffff8675ffffff9928654c
J'ai cet Objectif-C fonction:
//Hash method Definition
- (NSString *)getHashEncription:(NSString *)key andData:(NSString *)data{
NSLog(@"Secret Key %@ And Data %@", key, data);
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
//HmacSHA256
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
length:sizeof(cHMAC)];
[Base64 initialize];
NSString *b64EncStr = [Base64 encode:HMAC];
NSLog(@"Base 64 encoded = %@",b64EncStr);
NSLog(@"NSData Value %@", HMAC);
// unsigned char hashedChars[32];
// NSString *inputString;
// inputString = [NSString stringWithFormat:@"hello"];
// NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
// CC_SHA256(inputData.bytes, inputData.length, hashedChars);
return [[NSString alloc] initWithData:HMAC encoding:NSASCIIStringEncoding];
}//End of getHashEncription
Le résultat que j'obtiens est: est-ce
8736bc4aa7fc3aa071f2b4262b6972a89d2861559a20afa765e46ff17cb181a9
J'ai essayé de supprimer le codage base64, mais il ne fonctionne pas.
Toutes les suggestions sont la plupart de bienvenue.
source d'informationauteur Tushar
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour réparer votre Java hmac imprimante, car
4effffffd8ffffffce7cffffffc4ffffffc71b2f72ffffffdc21ffffffa1ffffffe0ffffffe62d32550b0771296bffffff9c1159ffffffdeffffff8675ffffff9928654c
n'est pas valide. Tous ceuxffffff
il y a un cadeau que vous êtes en signe d'allongement de l'octets à 32 bits signé entiers avant de les convertir en hexadécimal. Sans doute le bon hmac est4ed8ce7cc4c71b2f72dc21a1e0e62d32550b0771296b9c1159de86759928654c
.De toute façon, je soupçonne que vous appelez votre méthode de manière incorrecte. J'ai copié ton code dans un programme de test qui me donne cette sortie de votre clé et les données:
Qui correspond à votre sortie désirée (sauf pour le signe-les erreurs d'extension).
Voici mon programme de test:
Ligne
a un bug
Si dans votre clé serait 0x00 octet
strlen(cKey)
donnerait tort longueur et hmac processus de génération va produire certains des ordures.Dans mon application j'ai changé: