【问题标题】:Is it safe to send a password via a Socket created by the default SSLSocketFactory?通过默认 SSLSocketFactory 创建的 Socket 发送密码是否安全?
【发布时间】:2020-05-03 19:01:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • “我假设这意味着 服务器已经确认连接是安全的,但我不能 100% 确定。” - 错误的。 cookie 的 secure 属性没有说明当前连接,但意味着客户端应仅使用 HTTPS 将 cookie 发送回。甚至 HTTPS 实际上并不意味着安全,因为它可能是例如客户端没有正确检查服务器证书。
  • 安全?你在问什么潜在的攻击?你是在问SSLSocketFactory 是否曾经返回一个不使用 TLS 的套接字? (不,不会。)更重要的是您将密码发送给谁,这意味着您需要确保您的信任锚设置正确。
  • 只要您没有启用匿名密码套件并且适当地检查了服务器证书,连接就是安全的。
  • @user207421 我只做了我在帖子中提到的事情。话虽如此,我不认为我检查了服务器证书。这并不是说我不信任将凭据发送到的服务器。
  • "...我正在制作一个特定于我信任的网站的网络抓取工具..." - 验证证书和信任服务器是不同的事情。验证证书是为了确保您与 预期 服务器而不是中间的某个人交谈。成功验证并不意味着您可以信任服务器。类似地信任服务器并不意味着您可以跳过证书验证。

标签: java sockets ssl password-encryption sslsocketfactory


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 2013-08-17
    • 2014-02-12
    • 1970-01-01
    • 2010-12-07
    • 2011-03-22
    • 2016-12-23
    • 2012-03-16
    • 2014-12-27
    相关资源
    最近更新 更多