我正在使用一个应用程序,它将质询响应存储在某种类型的md5哈希中。有一种api方法可以检查所有响应是否正确,但由于某种原因,没有一种方法可以检查一个响应,这是我的要求。我不是想解密。我只是尝试以与应用程序相同的方式进行加密以进行比较。我有一个JCE库。我担心我对加密很新,所以请详细解答请帮助一个菜鸟。这是我从属性文件中收集的内容:
algorithm=PBEWithMD5AndDES
password=pooface
digest=MD5
示例哈希如下所示:
MD5:MXgxY21tdXR4bjB0:oRu+jlpCO/eSdwMb0iTVbw==
他们都返回MD5:< 16chars>:< 24chars>。任何指导都有帮助。提前谢谢。
答案 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”将毫无意义。
我怀疑(但这只是猜测):
需要考虑的其他事项:
可以使用salt来派生加密密钥。
盐可能会在加密中使用。
您说“挑战响应”:这可能意味着身份验证应用程序发明了一个挑战(可能是一个随机数),然后让客户端根据此挑战和某些秘密的知识来计算某些内容。挑战可能是盐(但有几个原因可能不是这样)。
在PBE中,您有两个输入:密码(用于派生加密密钥)和被加密的东西。我假设使用来自“pooface”的派生密钥(使用PBE / MD5)加密响应。这可能是错误的方式:使用质询响应派生密钥(使用PBE / MD5),并使用它来加密“pooface”。这对我来说似乎不太可能。
据推测,您可以使用已知密码(或挑战响应,或者他们称之为的任何内容)创建您自己的用户,即您可以提供已知输入并查看最终输出的内容。从逆转的角度来看,这很有用。在弄清楚加密是什么时,我还会使用一些实用程序: