Xcode和PHP中的SHA1具有不同的结果

时间:2015-06-28 18:33:03

标签: php ios hash encoding sha1

我在php中做一些工作尝试通过SHA1加密字符串。但是,我需要将结果与在Xcode中完成的其他人的结果相匹配。 他在Xcode中所写的内容如下:

NSString *saltedPassword = [NSString stringWithFormat:@"%@%@",_myTextField.text,saltKey];
NSString *hashedPassword = nil;
unsigned char hashedPasswordData[CC_SHA1_DIGEST_LENGTH];
NSData *saltedData = [saltedPassword dataUsingEncoding:NSUTF8StringEncoding];
if (CC_SHA1([saltedData bytes], [saltedData length], hashedPasswordData)) {
    hashedPassword = [[NSString alloc] initWithBytes:hashedPasswordData length:sizeof(hashedPasswordData) encoding:NSASCIIStringEncoding];
} else {
    NSLog(@"ERROR: registerAction, should not be here");
    abort();
}

我不太了解Xcode。我对他所做的事情的理解是:

  1. 将字符串与键连接以获取新字符串,我们称之为“string1”。
  2. 将string1编码为UTF-8,让我们调用编码字符串“string2”
  3. 使用SHA1加密string2,长度为20(CC_SHA1_DIGEST_LENGTH为20,对吧?),让我们调用加密字符串“string3”
  4. 将“string3”编码为ASCII以获得最终结果。
  5. 所以,基于我上面的理解,我在php中编写了如下代码:

    $password.=$configs['key'];
    $password=mb_convert_encoding($password, "UTF-8");
    $codedPassword=sha1($password, $raw_output = TRUE);
    $codedPassword=mb_convert_encoding($codedPassword, "ASCII");
    echo($codedPassword);
    

    $ password是我要加密的字符串。 但是我得到的结果与Xcode的结果不同。我们使用相同的密钥。

    例如:

    如果输入为“123456”,则Xcode的输出为“Õÿ:> / o×NVÛ²¿+(A7“,php的输出是”| J??7b?a ???=?d ???“。(我不确定这些是否是确切的字符串或字符串本身包含一些无法显示的字符。)

    有谁知道如何更改php代码以获得相同的结果?(您的解决方案是关于如何更改PHP代码将是完美的。因为我暂时无法更改Xcode。我的工作是写用于匹配Xcode结果的PHP代码。)

1 个答案:

答案 0 :(得分:0)

你似乎在描述:

NSData *saltedData = [saltedPassword dataUsingEncoding:NSUTF8StringEncoding];

as'将string1编码为UTF-8,让我们调用编码字符串" string2"'和做:

$password=mb_convert_encoding($password, "UTF-8");

然而,该步骤是将字符串转换为字节数组,例如查看此问题的答案String to byte array in php,您似乎应该在此步骤中执行以下操作:

$bytes = unpack("H*",$password);