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

How to get the actual block cipher key size for Java SSL connection _in code_?

当一个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)
};  

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

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

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

Abstraction/automation 一切都很好,但你可以走得太远。这里的(半)硬编码 table 没问题。