从某个库中 Java 中的 TLS 密码套件文本到整数或十六进制值查找?

TLS cipher suite text to integer or hex value lookups in Java from some library?

我有一些使用 TLS 的代码库,它通过所选密码的整数值与实际密码处理一起工作。所选密码提取如下:

String cipherSuite = sslSocket.getSession().getCipherSuite();

这是一个类似于 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 的值,并且具有整数值 49200 或十六进制的 0xc030。代码库有一个手动定义的映射 class,即 returns 给定密码名称的密码的整数值。

我从 IDE 查看了那里的 SSLSocket 对象链,看看还有哪些其他方法可用,但没有找到任何可以进行手动映射 class 查找的方法做了。

从另一个微弱相关的 SO post 网上,我找到了一个 table 的 TLS 密码及其值:https://web.archive.org/web/20151219054439/http://www.thesprawl.org/research/tls-and-ssl-cipher-suites/.

现在我只是想知道而不是通过努力维护完整的 table 映射,以防将来情况发生变化,是否已经有一些 Java class我们可以打电话来做查找吗?例如按密码名称查找以获得 integer/hex 值,反之亦然?我不是安全专家,也不是 Java 大师,所以不知道。

P.S。我正在使用的代码库没有我提到的 table link 的完整映射,只有部分子集。遇到这个问题是因为代码库由于缺少一些现在正在系统中使用的密码而失败。我添加了丢失的密码,但正在寻找一种更优雅的方式来维护密码映射或查找。

您可以获取现有会话的标准 TLS 密码套件代码。您对 "took a look ... from an IDE" 的方式含糊不清,但是如果您使用调试器查看,您应该看到套接字(或引擎)的 SSLSessionImpl 包含 cipherSuite,而 cipherSuite 又包含 int id (代码)和 String name(名称),尽管 SSLSession returns 的 API 只有后者。例如在我的 Eclipse 中:

因为这些 classes 和它们的字段(和方法)不是 public 你不能直接访问它们,但至少通过 j8 你可以通过反射这样做:

    SSLSocket sock = (SSLSocket) SSLSocketFactory.getDefault().createSocket("example.com",  443);
    SSLSession sess = sock.getSession(); // actually sun.security.ssl.SSLSessionImpl
    Class<?> c1 = Class.forName("sun.security.ssl.SSLSessionImpl");
    Field f1 = c1.getDeclaredField("cipherSuite"); f1.setAccessible(true);
    Object cs = f1.get(sess);
    Class<?> c2 = Class.forName("sun.security.ssl.CipherSuite");
    Field f2 = c2.getDeclaredField("id"); f2.setAccessible(true);
    Integer id = (Integer) f2.get(cs);
    System.out.printf("%x%n", id);

在 j9 up 的 'module' 方案中,这给出了 'illegal reflective access' 的警告,尽管到目前为止(直到 13.0.1)它确实成功了。如果我能更好地理解模块的工作原理,我会尝试改进它。 (或者这是 Stack,其他人可以。)

请注意,这实际上并没有像您所要求的那样提供 映射 ,只是当前连接的值似乎是您的实际需要。如果你真的想要一个映射, CipherSuite 实际上是一个枚举 class 所以所有的实例实际上都在那里,但是看代码看起来用于查找这个映射的方法已经在不同的地方改变了版本,以及非public,所以我不会在不知道你需要哪个的情况下尝试计算多个示例。