调试如何在代码中获取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 楼答案
您可以简单地从连接字符串中解析密钥大小。如果是DES-EDE,则为168(如果计算奇偶校验位,则为192)。否则它有一个默认值,或者密钥大小直接位于对称算法的名称后面
我想说,Apache方式似乎是一种非常可以接受的方式。无论如何,对于IDEA等密码,您必须手动插入默认密钥大小。实例化一个
Cipher
对象只是为了获得可接受的密钥大小,这对我来说似乎有些过分抽象/自动化都很好,但你可能走得太远了。这里的(半)硬编码表没有问题