【问题标题】:How to use ChaCha cipher in SSL ciphersuite using java如何使用 Java 在 SSL 密码套件中使用 ChaCha 密码
【发布时间】:2015-06-05 15:12:03
【问题描述】:

我试图找到在 Java SSL 客户端中编辑支持的密码套件的方法,以便提供特定的密码套件列表。

一个建议的解决方案是使用 @jww 在此链接中发布的 SSLSocketFactoryEx 类:Which Cipher Suites to enable for SSL Socket?

我确实添加了 SSLSocketFactoryEx 类并运行列出此类支持的密码的代码(注意:我使用了 GetCipherList();而不是 getSupportedCipheSuites() ; 因为第一个是我在 SSLSocketFactoryEx) 中找到的。代码是:

import java.io.IOException;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.util.Arrays;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class ListCiphers {

    public static void main(String[] args) throws UnknownHostException, IOException, KeyManagementException, NoSuchAlgorithmException
    {   
        Security.addProvider(new BouncyCastleProvider());

        //BC is the ID for the Bouncy Castle provider;
        if (Security.getProvider("BC") == null){
            System.out.println("Bouncy Castle provider is NOT available");
        }
        else{
            System.out.println("Bouncy Castle provider is available");
        }

        SSLSocketFactoryEx factory = new SSLSocketFactoryEx();
        String[] cipherSuites = factory.GetCipherList();
        System.out.println(Arrays.toString(cipherSuites));

    } //end main
}

Bouncy Castle (BC) 提供商支持我的代码,该提供商表示它支持规范中的 ChaCha 密码。见:https://www.bouncycastle.org/specifications.html

代码的结果(支持的密码)是:

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_EMPTY_RENEGOTIATION_INFO_SCSV

为什么我看不到ChaCha密码??

如果您查看 SSLSocketFactoryEx 代码,它包含几个带有 ChaCha 的密码套件。

为什么在使用 BC 提供程序后,我无法将它们添加到受支持的密码套件列表中?如何在受支持的密码套件列表中添加以下密码套件,以便将它们包含在客户端问候消息中??

ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
DHE_RSA_WITH_CHACHA20_POLY1305_SHA256

请帮忙。

【问题讨论】:

标签: java sockets ssl bouncycastle


【解决方案1】:

问题是JSSE实现(实现Java TLS支持)不支持ChaCha20。现在可以通过 JCE 提供者获得 ChaCha20 实现并不会改变这一点。

这类密码类不能随便加入;密码对要使用的密钥、IV、填充等有特定的要求。因此,您需要围绕密码编写代码,以便您的特定 TLS 实现支持它。

因此,您需要等到它被支持(如果有的话)或使用支持它的 JSSE(Java 安全套接字扩展,TLS)提供程序。我猜它可能会在 1.3 完成后可用,因为它标准化了 AEAD(经过身份验证的)密码,而 ChaCha20 + Poly 1305 将是一个非常快速的配置。

【讨论】:

  • BC 没有 SSL 提供商吗?
  • @EJP 仅在轻量级 API (org.bouncycastle.*) 中。我认为它没有 JSSE 提供程序,这是用户尝试使用的。尽管如此,使用轻量级 API 还是有可能的。
  • @Maarten Bodewes 我不知道您的回答是否可以使用 BC 来实现我想要的?如果不是,那为什么? BC 规范说它支持 ChCha。你能帮我用另一种编程语言,允许我添加/删除 OpenSSL 支持的任何密码吗? python允许吗?
  • 再次重申:在通用 API 中支持单独的密码并不意味着它可以被 TLS 实现自动神奇地使用。这将需要额外的编程。这适用于任何实现。这就像为汽车找到一个随机的车轮,并期望它无需修改就可以安装。你的轻量级 API,也许它是在那里实现的。
猜你喜欢
  • 2012-12-06
  • 2018-05-30
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 2015-02-24
相关资源
最近更新 更多