如何在java.security.MessageDigest中设置SHA摘要大小?

时间:2015-01-25 19:13:16

标签: hash java sha

我有点玩SHA-1算法。如果我在SHA-1算法中为大学报告更改了一些值,我想找出结果中的差异和变化。我找到了一段java代码来生成文本的哈希值。它是通过导入

完成的
  

java.security.MessageDigest中

类。但是,我想更改h0-4值并对其进行编辑,但我不知道在哪里可以找到它们?我查看了MessageDigest类,但无法在那里找到它。请帮帮我!

提前完成。

3 个答案:

答案 0 :(得分:0)

我不相信你能做到这一点。 Java没有为其MessageDigest Class提供任何API,这可以允许您更改值。

然而,有一些解决方法(我从来没有尝试过)。看一下这个answer to the question "How to edit Java Platform Package (Built-in API) source code?"

答案 1 :(得分:0)

如果您正在调整算法,那么您就不应该使用实现该算法的内置类。您提到的课程旨在为那些只想在生产中使用它们的人实施标准算法;如果你使用 SHA-1(或任何加密算法)而不是玩游戏和调整它,那么自己更改算法永远不是一个好主意(例如通过更改初始哈希值),因此该类不支持修改这些常量。

自己实施算法;从维基百科的伪代码来看,它看起来并不复杂。我知道"不要实施自己的加密,使用标准且经过良好测试的实施"这是一个常见的口头禅,但这只适用于生产型代码 - 如果您正在使用算法来查看调整后的效果,您应该自己实现它,所以你可以更灵活地修改它并看到修改的效果。

答案 2 :(得分:0)

基本上增加了@ Rahil的答案,但是评论太多了:

即使没有API访问权限,如果MessageDigest是实现,您也可以使用反射。但事实并非如此。

大多数java标准库只是通常有用的类,例如, java.util.ArrayList包含ArrayList(或者ArrayList<?>自6)的实现,java.io.FileInputStream包含FileInputStream的实现(虽然它可能在该实现中使用其他类)等.Java Cryptography使用更多复杂的方案,其中的实现不在API类中,而是在“提供者”中,主要在他们自己的jar中(在JRE / lib和JRE / lib / ext中)而不是rt.jar而且大多数(?)没有源在src.zip中。

因此java.security.MessageDigest类没有实现SHA1,SHA256或MD5等的代码。相反,它有代码来搜索JVM当前的加密提供程序列表,以找到任何算法的实现。要求,并实例化和使用它。通常,使用的提供程序列表设置为JRE分发中包含的提供程序(列表),尽管管理员或程序可以更改它。 对于普通的JRE7提供程序,SHA1由sun.security.provider.SHA实现。

实际上,像MessageDigest Signature Cipher KeyGenerator等API类更像界面或外观,通过呈现可能的多个底层实现共同的行为,尽管在Java代码术语中它们是实际的类而不是接口。

这是在1990年左右设计的,以应对当时有效的加密法律限制,特别是对美国的出口。它允许基础Java平台轻松分发,因为它本身并没有加密。要使用它 - 即使你没有对Java中的用户数据进行“真正的”加密,你仍然需要验证签名代码 - 你需要添加一些提供者;您可能拥有一组提供程序,具有完整且强大的算法,在美国安装中使用,而另一组则使用较少且较弱的算法,在其他地方使用。自从美国正式放宽并且实际上基本上放弃了2000年的执法以来,现在更不需要这种能力,尽管有定期要求将其恢复。但是仍有一个残余位:JCE(在Oracle JRE中)包含一个不允许128位以上对称密钥的策略;使您必须从Oracle网站下载并安装一个额外的(微小)文件“JCE Unlimited Strength Policy”。

TLDR:不要尝试更改JCE实现。正如@cpast所说,在这种情况下你想要使用标准算法不同的东西,编写你自己的代码。