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

时间:2015-06-05 15:12:03

标签: 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

请帮助。

1 个答案:

答案 0 :(得分:2)

问题是JSSE实现(实现Java TLS支持)不支持ChaCha20。 ChaCha20实现现在可通过JCE提供商获得,但不会改变它。

这些密码类不能只被丢弃;密码具有关于要使用的密钥,IV,填充等的特定要求。因此,您需要围绕密码编写代码,以使您的特定TLS实现支持它。

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