Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TLS密码套件在Java中从某个库中查找整型或十六进制值的文本?_Java_Ssl_Tls1.2 - Fatal编程技术网

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

TLS密码套件在Java中从某个库中查找整型或十六进制值的文本?,java,ssl,tls1.2,Java,Ssl,Tls1.2,我有一些使用TLS的代码库,它通过所选密码的整数值与实际的密码处理一起工作。所选密码提取如下: String cipherSuite = sslSocket.getSession().getCipherSuite(); 这是一个类似于TLS_ECDHE_RSA_的值,带有_AES_256_GCM_SHA384,整数值为49200或0xc030(十六进制)。代码库有一个手动定义的映射类,该类返回给定密码名称的密码的整数值 我从IDE中查看了SSLSocket对象链,以了解还有哪些其他方法可用,但

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

String cipherSuite = sslSocket.getSession().getCipherSuite();
这是一个类似于TLS_ECDHE_RSA_的值,带有_AES_256_GCM_SHA384,整数值为49200或0xc030(十六进制)。代码库有一个手动定义的映射类,该类返回给定密码名称的密码的整数值

我从IDE中查看了SSLSocket对象链,以了解还有哪些其他方法可用,但没有找到任何可以执行手动映射类所执行的查找的方法

从另一篇与此相关的SO在线帖子中,我发现了一个TLS密码及其值的表:

现在我只是想知道,如果将来情况发生变化,我们是否已经可以调用一些Java类来进行查找,而不是通过维护完整的表映射?e、 g.按密码名称查找以获得整数/十六进制值,反之亦然?我不是安全专家,也不是Java大师,所以我不知道

另外,我使用的代码库没有我提到的表链接的完整映射,只有部分子集。遇到这个问题时,代码库由于丢失了系统中正在使用的一些密码而失败。我添加了缺少的密码,但正在寻找一种更优雅的方法来维护密码映射或查找。

您可以获得现有会话的标准TLS ciphersuite代码。你很模糊你是怎么看的。。。从IDE中,但如果使用调试器查看,您应该会看到套接字或引擎的SSLSessionImpl包含cipherSuite,而cipherSuite又包含int-id代码和String-name名称,尽管SSLSession的API只返回后者。例如,在我的Eclipse中:

由于这些类及其字段和方法不是公共的,您无法直接访问它们,但至少通过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以上的“模块”方案中,这给出了“非法反射访问”的警告,尽管到目前为止,直到13.0.1它确实成功了。如果我能更好地掌握模块的工作原理,我会努力改进这一点。或者这是堆栈,其他人可以


请注意,这实际上并没有按照您的要求提供映射,只提供当前连接的值,这似乎是您的实际需要。如果你真的想要一个映射,CipherSuite实际上是一个枚举类,所以所有的实例实际上都在那里,但是从代码上看,用来查找这个映射的方法在不同的版本中发生了变化,并且是非公开的,因此,我不会在不知道需要哪一个示例的情况下,费力地尝试出多个示例。

谢谢,我真正需要的是当前连接的值,但是映射会很好。稍后我将对此进行尝试。为了从IntelliJ IDE中查看,我没有进行调试会话,只是在IDE中打开了代码,并查看intellisense/autocomplete为可用的公共方法找到了什么。