使用PBEWithMD5AndDES加密字符串以与Java存储的哈希进行比较

时间:2014-03-11 18:30:19

标签: java encryption md5 jce

我正在使用一个应用程序,它将质询响应存储在某种类型的md5哈希中。有一种api方法可以检查所有响应是否正确,但由于某种原因,没有一种方法可以检查一个响应,这是我的要求。我不是想解密。我只是尝试以与应用程序相同的方式进行加密以进行比较。我有一个JCE库。我担心我对加密很新,所以请详细解答请帮助一个菜鸟。这是我从属性文件中收集的内容:

algorithm=PBEWithMD5AndDES
password=pooface
digest=MD5

示例哈希如下所示:

MD5:MXgxY21tdXR4bjB0:oRu+jlpCO/eSdwMb0iTVbw==

他们都返回MD5:< 16chars>:< 24chars>。任何指导都有帮助。提前谢谢。

1 个答案:

答案 0 :(得分:4)

不是真正的“答案”,而是一些指示:

  • 在没有文档的情况下,你可能最好对API实现进行逆向工程(如果你有,并且它是合法的)来弄清楚它在做什么。 (从原则上讲,您应该能够要求API使用散列(或以其他方式)密码的算法文档,否则它是默默无闻的安全性)。如果没有:

  • oRu + jlpCO / eSdwMb0iTVbw ==是Base64编码的二进制文件。如果您使用Base64解码它,您将获得128位,这是MD5哈希的大小:0xa11bbe8e5a423bf79277031bd224d56f。

  • MXgxY21tdXR4bjB0可能是一个盐(即为了防止字典攻击而添加到收到的密码中的内容:MD5(“密码”)已知且易于预先计算,而MD5(“MXgxY21tdXR4bjB0password”)不是)。这与前一点一起,建议您计算盐的MD5哈希加上其他东西,以产生由Base64解码oRu ...数据产生的128位。

  • PBE代表基于密码的加密,即从密码生成对称密钥(在这种情况下使用MD5)(在这种情况下可能是pooface ......)然后使用该密钥加密某些东西(可能加密用户的密码)与DES。请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html中的“AlgorithmParameters算法”和PKCS#5:http://www.emc.com/emc-plus/rsa-labs/standards-initiatives/pkcs-5-password-based-cryptography-standard.htm

  • DES是块大小为64位的分组密码,因此输出(即密文)将是64位长的倍数。 可能它直接存储在您的示例哈希中,但不太可能,尤其是因为这意味着示例哈希行中的“MD5”将毫无意义。

  • 我怀疑(但这只是猜测):

    1. 使用PBEWithMD5AndDes根据密码“pooface”派生DES密钥。
    2. 使用该DES密钥加密用户密码。
    3. 使用MD5散列盐和密文,提供128位散列输出。
    4. Base64对哈希进行编码,为您提供oRu ...值。
  • 需要考虑的其他事项:

    • 可以使用salt来派生加密密钥。

    • 盐可能会在加密中使用。

    • 您说“挑战响应”:这可能意味着身份验证应用程序发明了一个挑战(可能是一个随机数),然后让客户端根据此挑战和某些秘密的知识来计算某些内容。挑战可能是盐(但有几个原因可能不是这样)。

    • 在PBE中,您有两个输入:密码(用于派生加密密钥)和被加密的东西。我假设使用来自“pooface”的派生密钥(使用PBE / MD5)加密响应。这可能是错误的方式:使用质询响应派生密钥(使用PBE / MD5),并使用它来加密“pooface”。这对我来说似乎不太可能。

据推测,您可以使用已知密码(或挑战响应,或者他们称之为的任何内容)创建您自己的用户,即您可以提供已知输入并查看最终输出的内容。从逆转的角度来看,这很有用。在弄清楚加密是什么时,我还会使用一些实用程序:

  • 编写一个获取密码并输出DES加密密钥的Java编程(即实现PBEWithMD5AndDes)。
  • 熟悉openssl命令,该命令将根据需要进行MD5哈希,DES加密和Base64(en | de)编码。
BTW,使用MD5和DES这些天有点差......