当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 codebase中找到了这段代码:
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)
};
它看起来像是一种可接受的解决方法。这是唯一的方法吗?
答案 0 :(得分:2)
您只需从连接字符串中解析密钥大小即可。如果是DES EDE则为168(如果计算奇偶校验位,则为192)。否则它有一个默认值或密钥大小直接在对称算法的名称后面。
我想说Apache方式似乎是一种非常可接受的方式。无论如何,您必须手动插入默认密钥大小 - 对于那些密码,例如IDEA。为了获得可接受的密钥大小而实例化Cipher
对象对我来说似乎有点过分了。
抽象/自动化都非常好,但你可以走得太远。这里的(半)硬编码表没有错。