首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用openssl在HMACSHA1上正确获取iPhone

使用openssl在HMACSHA1上正确获取iPhone
EN

Stack Overflow用户
提问于 2011-02-09 19:18:02
回答 2查看 853关注 0票数 2

啊,我的头疼!

上下文

我需要编写一些C/Objective代码来解密存储在远程服务器上的文件。加密是开源的,是用C#编写的。

我正在使用libssl.a和libcryption.a来自这个项目;

https://github.com/x2on/OpenSSL-for-iPhone

我的第一个障碍甚至是让字符串的HMACSHA1正确:(根据这里的参考站点,SHA1似乎是正确的-- http://hash.online-convert.com/sha1-generator,但HMAC不是。好的,那么现在是一些代码;

代码语言:javascript
复制
NSString *input = @"wombats";

// Define some strings etc that we need

unsigned char *inStrg = malloc(256);    
inStrg = (unsigned char *)[input UTF8String];
unsigned long lngth = [input length];
unsigned char result [EVP_MAX_MD_SIZE];
unsigned char hmacresult [EVP_MAX_MD_SIZE];

unsigned char newPassPhrase[25];
memset(newPassPhrase, 0, 25);

unsigned char salt[]  = "\x01\x02\x03\x04\x05\x06\x07\x08";

// The real code requires us to re-hash the input 1000 times. For now lets
// just check it with 10 (hey even the first is wrong). 

for (int i=0; i<10; i++)
{

// Use openssl

SHA_CTX shaContext;
SHA1_Init(&shaContext);     
SHA1_Update(&shaContext, inStrg, lngth );
SHA1_Final(result, &shaContext);

unsigned int len;

// If I look at result now, it matches the reference, so I think it is the next stage that goes wrong.

HMAC(EVP_sha1(),salt,8,result,20,hmacresult,&len);

printf("HMAC ----------------- : ");
hexPrint(hmacresult,len);

// Copy the result to the input so we can re-hash;

lngth = len;
memcpy((char *)inStrg,(char *)hmacresult,len);

}

我试图匹配的代码是以下C#片段。此代码生成正确的输出,是从生产服务器提取的。

代码语言:javascript
复制
 byte[] salt={0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8};
 UTF8Encoding utf8 = new UTF8Encoding();

 byte[] data = utf8.GetBytes("wombats");

 HMACSHA1 sha1= new HMACSHA1();
 sha1.Key = salt;

 for(int i=0; i<10; i++)
 {
    sha1.ComputeHash(data);
    data = sha1.Hash;
    Console.WriteLine(System.BitConverter.ToString(data));
 }

如果编译并运行C#代码,则得到的输出如下所示;

代码语言:javascript
复制
DC-F3-1C-C1-2F-8A-86-16-CC-74-1E-DA-25-7B-FF-16-6E-EB-2A-0F
E7-6A-F4-C6-73-07-DB-E8-52-82-9E-D1-96-BF-06-95-85-C6-94-F4
1F-E2-61-BC-F0-08-92-3C-14-70-2B-89-EB-46-C9-20-A5-90-65-9B
etc

如果我查看iPhone版本的输出,就会得到以下结果;

代码语言:javascript
复制
44-35-5b-bb-41-0e-bc-c3-d3-58-62-e6-5c-a0-51-6b-bc-97-11-f6
4c-3b-61-bd-1f-f7-72-13-af-1b-5e-5e-e3-70-8a-31-08-11-67-f2
41-56-8d-41-c1-3e-02-d0-d2-76-ad-d3-49-ba-71-ff-34-d7-3e-8b
etc

所以很明显有什么严重的问题。

如果我只检查SHA1部分,这似乎是正确的,所以我猜测要么我使用的是带有错误参数的HMAC,要么是C# HMACSHA1做了一些与我预期不同的事情。

我应该补充一点,如果我使用合适的ASCII salt,这里的在线生成器http://hash.online-convert.com/sha1-generator的结果也与C#代码相匹配,这使我强烈怀疑是我在iPhone上的C是错误的。

有人能帮我弄清楚问题出在哪里吗,我现在的想法快用完了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-09 22:46:52

删除重复的SHA1修复它。哈!

代码语言:javascript
复制
SHA_CTX shaContext;
SHA1_Init(&shaContext);     
SHA1_Update(&shaContext, inStrg, lngth );
SHA1_Final(result, &shaContext);

删除所有这些。

票数 1
EN

Stack Overflow用户

发布于 2011-02-09 19:46:48

只使用<CommonCrypto/CommonHMAC.h>中的方法(不是框架,只是/usr/include中的标头)是值得的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4949403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档