首页 > 解决方案 > 通过默认 SSLSocketFactory 创建的 Socket 发送密码是否安全?

问题描述

不假思索,我通过使用JavaSocket默认创建的连接发送了一个密码。SSLSocketFactory对于SSLSocketFactory.getDefault(),文档说明如下:

返回默认的 SSL 套接字工厂。第一次调用此方法时,ssl.SocketFactory.provider会检查安全属性。如果它不为 null,则加载并实例化具有该名称的类。如果成功并且对象是 的实例SSLSocketFactory,则将其设为默认 SSL 套接字工厂。

否则,此方法返回SSLContext.getDefault().getSocketFactory(). 如果该调用失败,则返回一个不工作的工厂。

我确信 Java 并没有试图欺骗我,但由于这是我第一次这样做,我想确保它是我可以依赖的密码加密的东西。

编辑:在服务器响应中“Set-Cookie”的属性数据的末尾,它显示“HttpOnly”,然后是“Secure”。我假设这意味着服务器已经确认连接是安全的,但我不是 100% 确定。

标签: javasocketssslpassword-encryptionsslsocketfactory

解决方案


当您通过 default 创建套接字SSLSocketFactory并且不使用相关系统和安全属性配置任何其他内容时,将使用与您的 Java 运行时捆绑的一组证书颁发机构。忽略一些细节,这是在您的 JRE 安装中找到的信任库,位于lib/security/cacerts. 这些证书包括那些被广泛接受的证书颁发机构的证书,类似于您的浏览器可能使用的列表。

因此,如果您连接的服务器使用通过这些知名机构之一颁发的证书,则该证书将被验证,否则连接将失败。

这可确保受信任的权威机构认证您所连接的一方的身份。只要他们的私钥没有被盗,您就可以依赖证书中绑定的名称。

但是,您需要验证主机名以确保服务器提供的证书与您期望的主机名匹配。这在您使用该类时会自动发生URL,但您需要在直接HostNameVerifier使用时显式设置SSLSocket

最后,即使您知道自己在与谁交谈,您仍然必须对您向他们披露的信息进行判断。不过,这不是技术问题。


推荐阅读