菜鸟教程小白 发表于 2022-12-12 10:28:59

ios - Objective-C 中 HMAC SHA1 实现的问题


                                            <p><p>我正在尝试使用 HMAC-SHA1 算法为休息请求创建 base64 签名。我专门使用 SinglePlatform API,步骤如下:</p>

<ol>
<li>去掉请求的域部分,只留下路径和查询:/locations/haru-7?client=YOUR_CLIENT_ID</li>
<li>检索您的私钥,该私钥以修改后的 Base64 编码为 URL,并使用 HMAC-SHA1 算法对上述 URL 进行签名。您可能需要将签名 key 解码为其原始二进制格式。在许多加密库中,生成的签名将采用二进制格式。</li>
<li>使用修改后的 Base64 for URL 对生成的二进制签名进行编码,以将此签名转换为可在 URL 中传递的内容。
使用 sig 参数将此签名附加到 URL:</li>
</ol>

<p>我目前的实现如下:</p>

<pre><code>    // Convert a modified Base64 key into Base64
NSString *modifiedKey = ;
modifiedKey = ;

// Decode the Base64 key
NSData *key = ;

// Construct a url with params
NSString *data = ;

// Convert key and data to c chars
const char *keyBytes = ;
const char *baseStringBytes = ;

unsigned char digestBytes;

CCHmacContext ctx;
CCHmacInit(&amp;ctx, kCCHmacAlgSHA1, keyBytes, strlen(keyBytes));
CCHmacUpdate(&amp;ctx, baseStringBytes, strlen(baseStringBytes));
CCHmacFinal(&amp;ctx, digestBytes);

NSData *digestData = ;

// Reconvert the into Base64 modified
NSString *signingKey = ;
signingKey = ;
signingKey = ;

if ( ) {
    -1];
}

NSLog(@&#34;Signing Key: %@&#34;, signingKey);
</code></pre>

<p>我最初收到的签名 key 是经过修改的 Base64,这就是我替换 -+_/字符的原因。此实现返回了正确的签名 key ,但不一致。</p>

<p>在将 Objective-C 转换为 C 时,我做错了什么吗?有没有更好的方法来处理这个问题?</p>

<p>我的应用程序正在使用 ARC。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>问题是我是用C方法来确定数据长度的:</p>

<pre><code>CCHmacContext ctx;
CCHmacInit(&amp;ctx, kCCHmacAlgSHA1, keyBytes, strlen(keyBytes));
CCHmacUpdate(&amp;ctx, baseStringBytes, strlen(baseStringBytes));
CCHmacFinal(&amp;ctx, digestBytes);
</code></pre>

<p>当我使用 NSString/NSData 长度方法时,它一直有效:</p>

<pre><code>CCHmacContext ctx;
CCHmacInit(&amp;ctx, kCCHmacAlgSHA1, keyBytes, );
CCHmacUpdate(&amp;ctx, baseStringBytes, );
CCHmacFinal(&amp;ctx, digestBytes);
</code></pre>

<p><strong>编辑:</strong><br/>
正如 <code>Ivo Beckers</code> 在评论中提到的,这也可以写成一行:</p>

<pre><code>CCHmac(kCCHmacAlgSHA1, keyBytes, strlen(keyBytes), baseStringBytes, strlen(baseStringBytes), digestBytes);
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Objective-C 中 HMAC SHA1 实现的问题,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/15976174/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/15976174/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Objective-C 中 HMAC SHA1 实现的问题