将SHA1字节数组从java转换为PHP


Conversion SHA1 byte array from java to PHP

我必须将一个web应用程序从Java更新为PHP,我发现了一些棘手的问题。。。最大的问题是将SHA1从Java转换为PHP,因为在我之前有人开发了一个需要特定身份验证代码才能工作的浏览器扩展。。。我无法更改插件,我只需要将web应用程序从java转换为php。。。

这是代码:

 private static final byte[] SecretKey;
  public static String AuthCode(String url) {
    byte[] urlBytes = url.getBytes("US-ASCII");
    byte[] concatenated = new byte[SecretKey.length + urlBytes.length];
    System.arraycopy(SecretKey, 0, concatenated, 0, SecretKey.length);
    System.arraycopy(urlBytes, 0, concatenated, SecretKey.length, urlBytes.length);
    byte[] hash = HashTools.calculateHash(concatenated, "SHA1");
    return CodecTools.encodeBASE64(hash);
  }
  static {
    SecretKey = new byte[] { 18, -15, -48, 73, 54, -115, 34, -87 };
  }

现在,我发现很难将SecretKey从字节转换为php中的其他内容。。因为php没有字节变量。。。我读到php中的sha1与java不同。

在PHP中,我不能制作数组字符的sha1,它只需要一个字符串。。。

(其他stackoverflow答案只建议如何将Java代码更改为等于php。我需要php代码应该等于Java…)

我希望有人能帮助我,因为我真的不懂Java。。。

感谢所有人:)

使用一个简单的字符串作为字节容器。

例如,如果您想存储密钥:

$secretKeyArray = array(18, -15, -48, 73, 54, -115, 34, -87);
$secretString = '';
foreach($secretKeyArray as $k => $v) {
   $secretString.= chr($v & 0xFF); // trim to 8 bits (for the negative values)
}

现在您已经将密钥存储在$secretString中。

编辑:

级联阵列为:

$concatenated = $secretString . $url;

然后

return base64_encode(sha1($concatenated, true));