8

我正在尝试实施SHA-2加密而不是SHA-1

为此,我知道这两种哈希算法之间的位数不同,这让我感到困惑。

如何实现这一点,我需要在哪些部分进行必要的更改?

我可以使用来自 Java、Python 和任何其他主要编程语言的任何开源库。

4

5 回答 5

31

首先,SHA-1 和任何与 SHA-2 相关的东西都不是“加密”算法。它们是哈希函数。在 SSL 中,散列函数主要用于通过HMAC构造的完整性而非机密性。哈希函数接受任意长度的输入,并产生固定长度的输出,这是对输入数据的一种“摘要”;该操作是不可逆的。

散列函数是“公开的”:没有机密数据,没有密钥;每个人都可以计算任何给定输入的散列函数输出。“消息验证码”(MAC)是一种“密钥哈希”:在此过程中还输入了一个秘密密钥(即任意一串比特),因此密钥的知识对于(重新)计算是必要的MAC 输出。这用于完整性检查(发送方使用密钥计算 MAC,接收方使用密钥重新计算 MAC;如果 MAC 匹配,则数据正确,因为不知道密钥的攻击者无法获得更改数据并根据更改的数据计算有效 MAC)。

HMAC 是一种将散列函数(例如 SHA-1)转换为 MAC 的结构。TLS(这是 SSL 的当前标准名称)使用 HMAC。当与给定的哈希函数h一起使用时,HMAC 的输出与h的输出具有相同的大小。该输出通常会被截断:HMAC/SHA-1 名义上产生 160 位输出,但在某些协议中习惯上只保留前 96 位。SSL 中不会发生这种截断。

FIPS 180-3标准定义了五种散列函数,分别命名为 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512,输出长度分别为 160、224、256、384 和 512 位。SHA-224、SHA-256、SHA-384 和 SHA-512 函数通俗地称为“SHA-2”,因此“SHA-2”不是一个函数,而是四个哈希函数的家族。

TLS规范定义了密码套件。密码套件是客户端和服务器在连接的初始阶段(“握手”)同意的一组密码算法。其中的算法是用于确保数据完整性的 MAC。一些标准密码套件指定 MAC 应为“带有 SHA-256 的 HMAC”,即使用 SHA-2 功能之一的东西。

因此,您的问题的答案是:“只需将客户端和服务器配置为使用带有 HMAC/SHA-256 的密码套件之一”。如果您的 SSL 实现不支持此类密码套件,那么您将不得不对其进行修改,这将需要彻底了解 SSL 的工作原理;阅读和理解完整的 RFC 5246 将是必要的。

于 2010-05-13T15:12:16.397 回答
1

hashlib模块支持所有SHA MessageDigest-2 算法。

于 2010-05-13T13:34:31.447 回答
1

据我所知,在 SSL 中实现 SHA256 所需了解的所有内容都包含在RFC 5246中。

但我怀疑你还远远没有理解足够的密码学来做到这一点...... SHA 2 不存在,你正在寻找 SHA256、SHA384 或 SHA512,它不是加密算法,而是加密哈希函数。

那么,您实际上想做什么?

于 2010-05-13T13:59:08.070 回答
1

我相信你会看到越来越多的这个问题。GoDaddy 现在在提交证书签名请求时有一个选项,可以指定您是要使用 SHA1 还是 SHA2。

不过,这是一个有趣的读物。我基本上知道它在问什么以及如何强制我的服务器使用使用其中一个或另一个的密码。不确定我确切地知道区别是什么,或者为什么使用其中一个会更好。

于 2013-09-08T04:42:56.577 回答
0

试试这个,它适用于 weblogic SQL Authenticator

 public static void main(String args[]) throws NoSuchAlgorithmException {
 String password="abcdef"; 
 System.out.println("{SHA-1}" + new sun.misc.BASE64Encoder().encode(java.security.MessageDigest.getInstance("SHA1").digest(password.getBytes())));
 }
于 2015-02-06T09:28:11.647 回答