java - 如何使用java在SSL密码套件中使用ChaCha密码

标签 java sockets ssl bouncycastle

我试图找到在 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

请帮忙。

最佳答案

问题在于 JSSE 实现(实现了 Java TLS 支持)不支持 ChaCha20。 ChaCha20 实现现在可以通过 JCE 提供商获得,但这并没有改变这一点。

这些类型的密码类不能直接放入;密码对于要使用的 key 、IV、填充等有特定要求。因此,您需要围绕密码编写代码,以使其受到您的 TLS 的特定实现的支持。

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

关于java - 如何使用java在SSL密码套件中使用ChaCha密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30670001/

相关文章:

java - 井字游戏

java - 反向地理编码 Android 问题

c++ - 如何在应用程序关闭时通过套接字从 DLL 发送消息?

sockets - 针对低延迟和小数据包的建议 TCP 套接字设置

c# - 为 MQTTnet 客户端消息的 TLS/SSL 加密导入的 PFX 证书适用于服务,但在 Xamarin UWP 应用程序中失败

java - jconnect 支持 ASE 15.0.3

Java - 将任何单位转换为任何单位

c# - 浏览器尝试连接和 Socket.Accept() 之间的长时间延迟 [~1s]

Wordpress 站点从 https 恢复...链接断开

ssl - 通过 IP 地址访问 HTTPS 的证书错误