我试图打电话给亚马逊网络服务并且我坚持获得签名,看着这个,但我仍然有一个问题。
使用这个例子是什么
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]
答案 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 也许它可以帮助你。