Java和Php返回不同的哈希值

时间:2014-06-29 18:33:21

标签: java php encryption hash whirlpool

所以,PHP代码:

$result = hash("whirlpool","xxx".$password."zzz");

JAVA:

import gnu.crypto.Registry;
import gnu.crypto.hash.HashFactory;
import gnu.crypto.hash.IMessageDigest;

public class WhirlpoolHash {

    String result;

    WhirlpoolHash(String pass) {

        String to_encode = "xxx"+pass+"zzz";

        IMessageDigest old_encoder = HashFactory.getInstance(Registry.WHIRLPOOL_HASH);
        byte[] input = to_encode.getBytes();
        old_encoder.update(input, 0, input.length);
        byte[] digest = old_encoder.digest();
        this.result = gnu.crypto.util.Util.toString(digest).toLowerCase();

    }

    public String Get() {

        return this.result;
    }
}

结果变量不同。我需要java类返回与php相同的值。 我有密码存储在由PHP生成的MySQL DB UTF-8编码中,需要将其与JavaFX app发送的数据进行比较。

当然我可以发送未加密的密码,并用PHP做,但我不想。

2 个答案:

答案 0 :(得分:0)

所以Java example for encrypting pwd with whirlpool algorithm using gnu-crypto jar是一个答案。

我不知道为什么,但jonelo.jacksum.JacksumAPI给出与PHP相同的结果。

答案 1 :(得分:0)

迟来的反应,但以防其他人得到帮助。

我遇到了几乎完全相同的问题,并在Java中使用了Bouncy Castle。经过一番尝试和错误之后,我使用Whirlpool进行了哈希处理以匹配我的PHP哈希,该哈希看起来与您的哈希相似。假设您输入密码:

    WhirlpoolDigest messageDigest = new WhirlpoolDigest();

    final String convertedHash = "xxx" + password + "yyy";
    messageDigest.reset();
    final byte[] bytes = convertedHash.getBytes();
    messageDigest.update(bytes, 0, bytes.length);

    byte[] hash = new byte[messageDigest.getDigestSize()];

    messageDigest.doFinal(hash, 0);

    System.out.println(Hex.toHexString(hash));

对我来说最大的问题是最后的步骤-doFinal()和Hex.toHexString()...

我的maven依赖项看起来像这样:

    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-ext-jdk15on</artifactId>
        <version>1.64</version>
    </dependency>