【问题标题】:SSL encryption, SHA-1 and SHA-2SSL 加密、SHA-1 和 SHA-2
【发布时间】:2011-02-19 02:32:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您对哪种 SHA-2 算法感兴趣?
  • 它实际上并不重要,只要它是一个 SHA-2 算法 :) 问候
  • 这和 SSL 有什么关系?

标签: encryption ssl sha1 hash-function sha2


【解决方案1】:

首先,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 是必要的。

【讨论】:

  • 我对 RFC 5246 的想法有点不妥。我不认为这是一个轻松有趣的阅读之夜?
【解决方案2】:

hashlib moduleMessageDigest 支持所有 SHA-2 算法。

【讨论】:

    【解决方案3】:

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

    但我怀疑您还远远没有理解足够的密码学来执行此操作... SHA 2 不存在,您正在寻找 SHA256、SHA384 或 SHA512,它不是加密算法,而是加密算法哈希函数。

    那么,你到底想做什么?

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        试试这个,它适用于 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())));
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-13
          • 1970-01-01
          • 2018-06-27
          • 1970-01-01
          • 2015-04-09
          • 2011-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多