【问题标题】:iPhone and HMAC-SHA-1 encodingiPhone 和 HMAC-SHA-1 编码
【发布时间】:2010-10-18 15:42:29
【问题描述】:

我试图拨打亚马逊网络服务的电话,但我一直在获取签名,看了看这个,但我仍然有一个问题。

使用这个例子是什么

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]

【问题讨论】:

    标签: iphone sha1 hmac


    【解决方案1】:

    我只花了大约 4 个小时在谷歌上搜索并寻找方法来计算 iPhone 上的未键入的 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 问题的人

    【讨论】:

    • 这太棒了!我只花了 30 分钟到一个小时左右的谷歌搜索就找到了这个(而不是 4 个),所以非常感谢! :)
    • 绝对有效 :-) - 但是没有更优雅的方式将 NSData 转换为 NSString 吗?
    【解决方案2】:

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

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

    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/

    只是提醒您,希望可以为您节省大量工作。

    【讨论】:

    • 它在哪里说“严格禁止移动客户端使用”aws.amazon.com/agreement
    • 我从使用 AWS 的实际经验中了解到,让 Amazon 从生产应用程序中撤销我的密钥。我曾经设法找到该子句,但我再也找不到它了 - 令人讨厌的是它不在您链接到的 AWS TOS 中(我什至在开始开发之前就已经阅读了它)
    • 我添加了更详细的链接来证明我的观点。有谁愿意删除反对票,因为我实际上是有帮助的,而且毕竟没有误导?
    【解决方案3】:
    // 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
    

    【讨论】:

    • 我实现了你的方法。我改用 SHA512。现在我的问题是如何将身份验证哈希发送到服务器。我用散列的数据初始化了一个 NSString 。但它由很多颠倒的问号组成,我不相信结果会很好。我可以发送原始数据吗?
    • @Julian 加密数据默认是二进制的。您必须能够发送二进制数据。这意味着您的通信协议应该支持二进制数据传输。如果它只支持文本数据(例如纯 HTTP 标头),则需要将二进制数据编码为字符串。微不足道的选择是BASE64 或定义明确且广泛使用的十六进制编码。
    • 一些语言缺乏处理二进制数据的能力通常返回任何返回字符串而不是二进制的实现实际上是在返回之前执行该编码。无论如何,他们通常会定义如何对其进行编码,因此请参阅语言规范以了解具体的编码方法。
    • 谢谢!由于 PHP 的 hash_hmac 函数默认返回 HEX,我决定对数据进行 HEX 编码。我完全忘记了二进制到字符串的转换...... :)) 谢谢
    【解决方案4】:

    查看CocoaCryptoHashing 的 SHA1 编码

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        Apple 的 iOS 开发人员库提供了一个名为 CryptoExercise 的优秀示例,其中包含一个简单的函数:

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

        【讨论】:

          【解决方案7】:

          你可以看到this 也许对你有帮助。

          【讨论】:

          • 不仅仅是提供链接,it would be preferable 在此处包含答案的基本部分,并提供链接以供其他参考。如果您不能胜任这项任务,您应该考虑在问题上简单地leaving a comment 而不是发布答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-26
          • 1970-01-01
          • 1970-01-01
          • 2012-08-14
          • 2011-03-21
          • 1970-01-01
          • 2014-07-19
          相关资源
          最近更新 更多