0

所以,PHP代码:

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

爪哇:

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 应用程序发送的数据进行比较。

当然,我可以发送未加密的密码,并使用 php 进行,但我不想这样做。

4

2 回答 2

0

因此,使用 gnu-crypto jar 使用漩涡算法加密 pwd 的 Java 示例就是一个答案。

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

于 2014-06-29T19:47:01.673 回答
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>
于 2020-01-16T04:18:03.577 回答