2015-06-28 39 views
2

我正在做一些在php上的工作尝试通过SHA1加密字符串。但是,我需要将结果与在Xcode中完成的其他人的结果相匹配。 他写在Xcode是什么如下:SHA1在Xcode和PHP中的结果不同

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. 编码的字符串1为UTF-8,让我们称之为的编码字符串“字符串2”
  3. 使用SHA1来加密字符串2,长度为20(CC_SHA1_DIGEST_LENGTH是20,是吗?),让我们称之为加密的字符串“STRING3”
  4. 将“string3”编码为ASCII以获得最终结果。

因此,基于以上我的理解,我写的代码在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); 

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

例如:

如果输入是 “123456” 时,Xcode的输出为 “OY:>/ ○×NVÛ²¿+(A7”,PHP的输出为“|百灵7b中? (我不确定这些是确切的字符串还是字符串本身包含一些无法显示的字符)

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

+0

'$ CONFIGS [“关键”];'是在PHP中盐? – meda

+0

1.“CC_SHA1”的输出是数据,通常不可能将数据转换为字符串,这样操作通常会失败。这是因为很多数据字节都不是有效的ASCII,例如值0x00 - 0x1f。这是一个散列,而不是加密,加密意味着它可以被解密。 – zaph

+0

提供样本输入和输出数据。 – zaph

回答

0

你似乎描述:

NSData *saltedData = [saltedPassword dataUsingEncoding:NSUTF8StringEncoding]; 

为“编码字符串1为UTF-8,我们称之为编码字符串‘字符串2’”,做:

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

但是这一步是转换字符串成字节数组,看看例如在回答这个问题String to byte array in php,看来你应该做这样的事情在这一步:

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

这似乎没有回答这个问题,也许更完整的解决方案。 – zaph

+0

为什么使用“H *”?我需要在开箱后将$字节转换为UTF-8吗? –

相关问题