【问题标题】:Java equivalent for PHP's pack functionJava 等价于 PHP 的 pack 函数
【发布时间】:2011-06-23 15:57:41
【问题描述】:

我有一个示例应用程序,它在 PHP 中生成一个 SHA1 哈希,如下所示。

base64_encode(pack('H*', sha1($pass)));

我尝试在 Java 中实现相同的功能,但到目前为止,输出有所不同。我使用的方法如下(Base64和Hex类来自commons-codec库)。

    byte[] rawSHA = null;
    byte[] base64HexSHA = null;
    String hex = null;
    MessageDigest md= null;

    // Get Message Digest Instance.
    try {
        md = MessageDigest.getInstance(SHA1_ALGORITHM);
    } catch (NoSuchAlgorithmException e) {
        LOG.error("Unable to load SHA-1 Message Digest : " + e.getMessage(), e);
        throw new IllegalStateException("SHA-1 Message Digest Instance Not Found");
    }

    // Build SHA1 Hash
    rawSHA = md.digest(rawText.getBytes("UTF-8"));

    // Convert to HEX
    hex = new String(Hex.encodeHex(rawSHA));

    // Encode to Base 64
    base64HexSHA = Base64.encodeBase64(hex.getBytes("UTF-8"));

    // Return String
    return new String(base64HexSHA);

我的问题是,我采用的方法会产生与 PHP 的 pack() 函数相同的输出吗?我的猜测是 PHP pack() 函数返回原始字节,其中 Hex.encodeHex 返回十六进制字符串形式(参考:http://www.w3schools.com/php/func_misc_pack.asp)。

如何在 Java 中实现与 PHP 的 pack() 函数相同的输出(或上述 PHP 代码的完整输出)?

【问题讨论】:

    标签: java php sha1 pack message-digest


    【解决方案1】:

    不需要转换为十六进制,只需使用这个:

    base64HexSHA = Base64.encodeBase64(rawSHA);
    

    【讨论】:

    • 非常感谢。我的错。在浏览完 pack 函数描述后,我决定对其进行 HEX 操作。最初它没有十六进制部分,但没有给我输出。刚才我发现是因为另一个问题(我传入的源字符串不是我期望的格式,有错字)。非常感谢。
    • 这不是问题的答案。很高兴您注意到不需要打包,但这并不能回答其他人会来这里的实际问题。你的回答应该是之后的推荐。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2011-06-08
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多