当我将 java 字符串转换为 md5 哈希时,我该如何解密它?
When i turn an java String into an md5 Hash, how can i decrypt it?
我正在使用 MessageDigest Class 研究 java 中的 md5 散列,假设我这样做
public void givenPassword_whenHashingUsingCommons_thenVerifying() {
String hash = "35454B055CC325EA1AF2126E27707052";
String password = "ILoveJava";
String md5Hex = DigestUtils
.md5Hex(password).toUpperCase();
assertThat(md5Hex.equals(hash)).isTrue();
}
所以我确实将我的密码字符串转换为 md5 哈希,假设我的收件人现在不希望字符串作为哈希,而是作为普通字符串(哈希仅用于传输),我如何转换 md5 哈希字符串返回 "normal" 文本字符串?
无法将哈希值(MD5 或 SHA1 或 SHA2....)转换为原始字符串。
hashing function 的目的是单向翻译。回不去了。
MD5 哈希函数是一种过时的加密函数,它生成输入数据的固定长度哈希。如何和为什么超出了这个答案的范围。我强烈建议您在线访问有关这些内容的详细文本。
另请记住,如果您出于加密和敏感原因使用 MD5,请了解更安全的推荐哈希算法,如 SHA256 等。
详情请参考this introductory text。
我们特别对密码进行散列处理的原因是因为它是一种方式,而且出于安全原因这是很好的。想象一下,一个坏人可以访问您的数据库,我们不希望他们能够查找密码并以用户身份登录。通过存储哈希密码,我们可以对登录时的密码进行相同的哈希算法,并将其与数据库中的数据库值进行比较,以判断登录是否成功。
即使这样也有问题。当不良行为者获得对受感染数据库的访问权限时,他们可以生成 "rainbow tables" 以从散列值获取密码。他们使用常见的散列算法和软件(例如 hashcat)建立一个包含常见密码、字典单词等的数据库,然后将散列值与纯文本字符串进行匹配。这就是为什么在存储密码的时候,我们也使用了salting,这个很容易研究,Google "salting and hashing".
我看到另一个回答 "The purpose of the hashing function is a one way translation"。我认为这是过于简单化了。哈希算法 returns 消息摘要。它是固定长度的字母数字消息,尽可能唯一地表示输入。哈希算法最重要的属性之一是消息的唯一性,它与类似输入的消息有很大不同。下面是一个使用 MD5 的例子:
字符串:aaaaaaaaaa
哈希:e09c80c42fda55f9d992e59ca6b3307d
字符串:aaaaaaaaab
哈希:ba05a43d3b98a72379fdc90a1e28ecaf
我正在使用 MessageDigest Class 研究 java 中的 md5 散列,假设我这样做
public void givenPassword_whenHashingUsingCommons_thenVerifying() {
String hash = "35454B055CC325EA1AF2126E27707052";
String password = "ILoveJava";
String md5Hex = DigestUtils
.md5Hex(password).toUpperCase();
assertThat(md5Hex.equals(hash)).isTrue();
}
所以我确实将我的密码字符串转换为 md5 哈希,假设我的收件人现在不希望字符串作为哈希,而是作为普通字符串(哈希仅用于传输),我如何转换 md5 哈希字符串返回 "normal" 文本字符串?
无法将哈希值(MD5 或 SHA1 或 SHA2....)转换为原始字符串。
hashing function 的目的是单向翻译。回不去了。
MD5 哈希函数是一种过时的加密函数,它生成输入数据的固定长度哈希。如何和为什么超出了这个答案的范围。我强烈建议您在线访问有关这些内容的详细文本。
另请记住,如果您出于加密和敏感原因使用 MD5,请了解更安全的推荐哈希算法,如 SHA256 等。
详情请参考this introductory text。
我们特别对密码进行散列处理的原因是因为它是一种方式,而且出于安全原因这是很好的。想象一下,一个坏人可以访问您的数据库,我们不希望他们能够查找密码并以用户身份登录。通过存储哈希密码,我们可以对登录时的密码进行相同的哈希算法,并将其与数据库中的数据库值进行比较,以判断登录是否成功。
即使这样也有问题。当不良行为者获得对受感染数据库的访问权限时,他们可以生成 "rainbow tables" 以从散列值获取密码。他们使用常见的散列算法和软件(例如 hashcat)建立一个包含常见密码、字典单词等的数据库,然后将散列值与纯文本字符串进行匹配。这就是为什么在存储密码的时候,我们也使用了salting,这个很容易研究,Google "salting and hashing".
我看到另一个回答 "The purpose of the hashing function is a one way translation"。我认为这是过于简单化了。哈希算法 returns 消息摘要。它是固定长度的字母数字消息,尽可能唯一地表示输入。哈希算法最重要的属性之一是消息的唯一性,它与类似输入的消息有很大不同。下面是一个使用 MD5 的例子:
字符串:aaaaaaaaaa 哈希:e09c80c42fda55f9d992e59ca6b3307d
字符串:aaaaaaaaab 哈希:ba05a43d3b98a72379fdc90a1e28ecaf