iPhone和HMAC-SHA-1编码

时间:2009-04-09 19:55:52

标签: iphone sha1 hmac

我试图打电话给亚马逊网络服务并且我坚持获得签名,看着这个,但我仍然有一个问题。

使用这个例子是什么

NSData *keyData;
NSData *clearTextData

?我需要为这两个值传递什么?

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

7 个答案:

答案 0 :(得分:33)

我只花了4个小时谷歌搜索并寻找方法来计算iPhone上的unkeyed SHA1,它将与php中的sha1()函数的结果相匹配。结果如下:

    #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

希望这有助于其他在iPhone上与SHA1抗争的人

答案 1 :(得分:5)

如果您正在调用亚马逊网络服务,请查看价格或产品详细信息,您的亚马逊网络服务密钥将被禁用,您的应用将停止工作。

查看亚马逊网络服务的服务条款,严格禁止移动客户使用:

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

当我的应用程序在生产应用程序中禁用了我的AWS密钥时,我发现了这一点。我已经阅读了TOS,但它并不是真的存在,因为您可以通过上面的链接看到其他一些模糊的使用细节。您不会认为联盟计划与API有任何关系,但确实如此。

您可以在此TechCrunch文章中找到阻止的其他应用的详细信息:

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

只是给你一个抬头,希望能为你节省很多工作。

答案 2 :(得分: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

答案 3 :(得分:0)

查看CocoaCryptoHashing的SHA1编码

答案 4 :(得分:0)

我向此here发布了一个解决方案,它返回AWS请求的Base64编码数据。

答案 5 :(得分:0)

Apple的iOS开发人员库提供了一个名为 CryptoExercise 的优秀样本,其中包含一个简单的功能:

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

答案 6 :(得分:-1)

你可以看到this 也许它可以帮助你。