Пример Java для шифрования pwd с помощью алгоритма whirlpool с использованием gnu-crypto jar
Я хочу зашифровать строку с помощью хэширования gnu.crypto.hash.Whirlpool.
Шифрование должно зашифровать пароль и вернуть зашифрованный pwd. шифруют (PWD);
Этот метод должен иметь реализацию для шифрования pwd с использованием gnu jars и whirlpool
алгоритм хэширования, который должен быть равен pwd, сгенерированному на сайте ниже http://hash.online-convert.com/whirlpool-generator
Я попытался с кодом ниже, но я не могу получить код 512 байт, похожий на сгенерированный сайт джакузи:
import gnu.crypto.hash.HashFactory;
import gnu.crypto.hash.IMessageDigest;
public class EncryptPwdWithAPI{
public static void main(String arg[])
{
encrypt("somepwd");
}
public static String encrypt(String password)
{
IMessageDigest md = HashFactory.getInstance("WHIRLPOOL");
md.update(input, 0, input.length);
byte[] digest = md.digest();
System.out.println( "Input : "+new String(input)+ "\nPWD : "+new String(digest)
}
}
3 ответа
Да, правильно, но я ожидал, что код whirlpool имеет 512 байт, что соответствует коду, сгенерированному онлайн-генератором хэш-кода. Я получил намеченный результат с JacksumAPI.
Вот некоторый код:
import java.security.NoSuchAlgorithmException;
import jonelo.jacksum.JacksumAPI;
import jonelo.jacksum.algorithm.AbstractChecksum;
public class JacksumTest {
public static void main(String arg[])
{
String password = "somepwd";
AbstractChecksum checksum = null;
try {
checksum = JacksumAPI.getChecksumInstance("whirlpool");
checksum.update(password.getBytes());
System.out.println(checksum.getFormattedValue());
} catch (NoSuchAlgorithmException nsae) { }
}
}
Вы непосредственно используете байтовые значения в качестве символьных значений, вместо этого вам следует преобразовать байтовый массив в кодировку hex или base64, чтобы сравнить его со значениями на сайте джакузи. Кодек Apache Commons предоставляет функции hex и base64.
import org.apache.commons.codec.binary.Base64;
...
Base64.encodeBase64String(digest);
@Eelke правильно, но вот как вы это делаете, кодированный пароль должен быть в переменной результата.
IMessageDigest oldencoder = HashFactory.getInstance(Registry.WHIRLPOOL_HASH);
byte[] input = password.getBytes();
oldencoder.update(input, 0, input.length);
byte[] digest = oldencoder.digest();
result = gnu.crypto.util.Util.toString(digest).toLowerCase();