有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

调试如何在代码中获取Java SSL连接的实际分组密码密钥大小?

当Java客户端建立了SSL/TLS会话时,它可以获取使用的协议和密码名称:

    SSLSession session = s.getSession();
    String protocol = session.getProtocol(); // e.g. "TLSv1"
    String cipher = session.getCipherSuite(); // e.g. "TLS_RSA_WITH_AES_128_CBC_SHA"

但一些密码可以具有大小为128或256的密钥(例如,AES CBC)

如何获得此特定连接的实际协商密钥大小

我在Apache代码库中找到了以下代码:

static final CipherData cipherSizes[] = {
    new CipherData("_WITH_NULL_", 0),
    new CipherData("_WITH_IDEA_CBC_", 128),
    new CipherData("_WITH_RC2_CBC_40_", 40),
    new CipherData("_WITH_RC4_40_", 40),
    new CipherData("_WITH_RC4_128_", 128),
    new CipherData("_WITH_DES40_CBC_", 40),
    new CipherData("_WITH_DES_CBC_", 56),
    new CipherData("_WITH_3DES_EDE_CBC_", 168),
    new CipherData("_WITH_AES_128_CBC_", 128),
    new CipherData("_WITH_AES_256_CBC_", 256)
};  

这看起来是一个可以接受的解决办法。这是唯一的办法吗


共 (1) 个答案

  1. # 1 楼答案

    您可以简单地从连接字符串中解析密钥大小。如果是DES-EDE,则为168(如果计算奇偶校验位,则为192)。否则它有一个默认值,或者密钥大小直接位于对称算法的名称后面

    我想说,Apache方式似乎是一种非常可以接受的方式。无论如何,对于IDEA等密码,您必须手动插入默认密钥大小。实例化一个Cipher对象只是为了获得可接受的密钥大小,这对我来说似乎有些过分

    抽象/自动化都很好,但你可能走得太远了。这里的(半)硬编码表没有问题