在Java中生成密码哈希值,类似于openssl passwd -1的方法。

4
有没有一种简单的方法在Java中生成与“openssl passwd -1”生成的密码哈希值相同的格式?
示例:
# openssl passwd -1 test
$1$Gt24/BL6$E4ZsrluohHFxtcdqCH7jo.

我正在寻找一个纯Java的解决方案,不调用openssl或任何其他外部程序。

谢谢 Raffael

3个回答

3

OpenSSL文档-1选项描述为:“使用基于MD5的BSD密码算法1。”

Jasypt是一个Java加密库,jBCrypt也是如此。 Jasypt略微复杂,但更具可配置性。

我对加密不是很了解,但我猜测由openssl生成的密码可以分解为:
$1$ - 指定使用MD5方案
Gt24/BL6 - 8字节盐
$ - 分隔符
E4ZsrluohHFxtcdqCH7jo. - 哈希值

因此,看起来Jasypt的BasicPasswordEncryptor可能是您想要的-


我怀疑这个,除非BasicPasswordEncryptor是有意与不稳定的FreeBSD MD5Crypt兼容设计的。 - President James K. Polk
它使用MD5,8字节的盐和1000次迭代(这似乎是crypt算法使用的 - http://www.mail-archive.com/freebsd-hackers@freebsd.org/msg23405.html),这就留下了实现本身吧…… - Jordan Stewart

0

也许像这样?

MessageDigest md = null;
md = MessageDigest.getInstance("SHA");
md.update(pPassword.getBytes("UTF-8"));
byte raw[] = md.digest();
String hash = BASE64Encoder.encodeBuffer(raw);

Java BASE64Encoder源代码可以在网络上找到。


或者你可以使用Commons Coded中的base64encoder:http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html - Valentin Rocher
$ 不是有效的 Base64 代码。我认为这里发生了更多的事情,不仅仅是 Base64 编码。 - Alexander Pogrebnyak

0

您可以在这里找到C语言版本的源代码。将其转换为纯Java应该很简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接