gpt4 book ai didi

java - apache.commons.Codec 中 Crypt.crypt() 和 DigestUtils.md5() 之间的区别

转载 作者:行者123 更新时间:2023-11-30 03:15:14 29 4
gpt4 key购买 nike

我正在为 Linux 上的 MD5 哈希方案编写一个基本的密码破解程序 /etc/shadow file 。当我使用commons.codec时的DigestUtilsCrypt库,它们的哈希长度是不同的(除其他外)。

当我使用Crypt.crypt(passwordToHash, "$1$Jhe937$")时输出是一个 22 个字符的字符串。当我使用DigestUtils.md5[Hex](passwordToHash + "Jhe937")时(或 Java MessageDigest 类)输出是一个 32 个字符的字符串(转换后)。这对我来说毫无意义。

<小时/>

旁白:有没有简单的方法来转换 DigestUtils.md5(passwordToHash)byte[]到一个字符串。我已经尝试了所有*方法,但得到了所有无效输出:Nz_èJÓ_µù[î¬y

*全部:new String(byte[], "UTF-8")并转换为 char,然后转换为 String

最佳答案

执行摘要是,虽然它们将执行相同的哈希,但两者之间的输出格式不同,因此长度也会不同。请继续阅读以了解详细信息。

MD5 是一种消息消化算法,它始终生成 16 字节哈希值(假设有效输入等)。这些字节不是都是可打印字符,它们可以采用 0- 之间的任何值任何字节都是 255,而 ASCII 中的可打印字符范围是 32-126。

DigestUtils.md5(String) 生成字符串的 MD5 并返回 16 元素字节数组。 DigestUtils.md5Hex(String) 是一个围绕 DigestUtils.md5 的方便包装器(我假设,我没有查看源代码,但这就是我的写法:-)),它采用 16 元素字节数组 md5 生成并对其进行 base16 编码(也称为十六进制编码)。这会将每个字节替换为等效的两个十六进制字符,这就是为什么您会从中得到 32 个字符的字符串。

Crypt.crypt 使用一种特殊的格式,可以追溯到原始的 Unix 存储密码的方法。多年来它已经被扩展以使用不同的哈希/加密算法、更长的盐和附加功能。它还将其输出编码为可打印文本,这就是长度差异的来源。通过使用“$1$...”的盐,您是说使用 MD5,因此密码加上盐将使用 MD5 进行哈希处理,从而产生预期的 16 个字节,但因为这些字节不一定是可打印的,哈希值采用 Base64 编码(使用与标准 Base64 编码略有不同的字母表),用 4 个可打印字符替换 3 个字节。因此 16 个字节变为 16/3 * 4 = 21-1/3 个字符,四舍五入为 22。

就您而言,DigestUtils.md5 生成 16 个字节,但这些字节可以具有 0 到 255 之间的任何值,并且(实际上)是随机的。 new String(byte[], "UTF-8") 表示字节数组中的字节是UTF-8编码,这是一种非常具体的格式。 new String 最好将字节视为 UTF-8 编码的字符串,但因为它们实际上不是,所以通常会得到乱码。如果您想要可打印的内容,则必须使用采用随机字节的内容,而不是特定格式(如 UTF-8)的字节。两个流行的选项是 base16/hex 编码,您可以通过 DigestUtils.md5Hex 获得,或者 base64,您可以通过 Base64.encodeBase64String(DigestUtils.md5(pwd + salt)) 获得。

关于java - apache.commons.Codec 中 Crypt.crypt() 和 DigestUtils.md5() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32789406/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com