在建立连接时,Oracle JDBC客户端是否会加密密码?

时间:2012-09-05 15:34:45

标签: oracle jdbc

当您使用Oracle JDBC客户端库建立Oracle连接时,默认情况下密码或安全握手是加密的吗? (想知道在使用Oracle JDBC客户端库建立连接时是否存在密码可能被嗅探的风险)

1 个答案:

答案 0 :(得分:24)

密码在通过网络传输时始终是加密的。

这并不是说它不受攻击。如果攻击者可以获取用户密码的哈希 ,他们可以监控合法客户端和数据库之间的网络流量,那么就可以获得纯文密码。

对于好奇,这里是各种版本的Oracle数据库软件的身份验证过程的摘要。处理加密密码传输的步骤以粗体显示。 JDBC驱动程序使用哪种版本的身份验证协议并不完全直观,因为它并不总是与其公布的版本匹配。这是因为客户端可以协商它希望使用的协议。例如,11g JDBC驱动程序在连接到11g数据库时可能不一定使用11g身份验证协议(它可能会回退到10g身份验证协议)。我忘了哪些驱动程序使用哪种协议。

Oracle数据库8中的身份验证协议

  1. 客户端请求特定用户的服务器会话密钥。
  2. 服务器生成服务器会话密钥。
  3. 服务器使用请求的用户密码哈希作为密钥加密服务器会话密钥。
  4. 服务器将加密的服务器会话密钥发送给客户端。
  5. 客户端使用用户的密码哈希作为密钥解密加密的服务器会话密钥。
  6. 客户端使用服务器会话密钥作为密钥加密用户的密码。 (基于DES的专有算法)
  7. 客户端将加密密码发送到服务器。
  8. 服务器使用服务器会话密钥作为密钥解密加密密码。
  9. 服务器计算解密密码的哈希值。
  10. 如果计算出的密码哈希值(来自步骤9)与存储在服务器上的副本匹配,则用户提供了正确的密码。
  11. Oracle Database 9i中的身份验证协议

    1. 客户端请求特定用户的服务器会话密钥。
    2. 服务器生成服务器会话密钥。
    3. 服务器使用请求的用户密码哈希作为密钥加密服务器会话密钥。
    4. 服务器将加密的服务器会话密钥发送给客户端。
    5. 客户端使用用户的密码哈希作为密钥解密加密的服务器会话密钥。
    6. 客户端使用服务器会话密钥作为密钥加密用户的密码。 (基于DES的专有算法)
    7. 客户端将加密密码发送到服务器。
    8. 服务器使用服务器会话密钥作为密钥解密加密密码。
    9. 服务器计算解密密码的哈希值。
    10. 如果计算出的密码哈希值(来自步骤9)与存储在服务器上的副本匹配,则用户提供了正确的密码。
    11. Oracle数据库10g中的身份验证协议

      1. 客户端从服务器请求会话密钥,指定它希望连接的用户。
      2. 服务器生成服务器会话密钥。
      3. 服务器使用请求的用户密码哈希作为密钥加密服务器会话密钥。
      4. 服务器将加密的服务器会话密钥发送给客户端。
      5. 客户端使用请求的用户密码哈希作为密钥解密加密的服务器会话密钥。
      6. 客户端生成客户端会话密钥。
      7. 客户端将客户端会话密钥与服务器会话密钥组合在一起。
      8. 客户端使用该用户的密码。
      9. 客户端使用组合的会话密钥(来自步骤7)作为其密钥来加密用户的盐渍密码。 (AES-128)
      10. 客户端使用用户的密码哈希作为密钥加密客户端会话密钥。
      11. 客户端将加密的客户端会话密钥和加密的盐渍用户密码发送到服务器。
      12. 服务器使用请求的用户密码哈希对加密的客户端会话密钥进行解密。
      13. 服务器将客户端会话密钥与其服务器会话密钥组合在一起。
      14. 服务器使用组合的会话密钥(来自步骤13)将加密的盐渍密码解密为密钥。
      15. 服务器取消盐渍密码。
      16. 服务器哈希解密后的密码。
      17. 服务器将计算出的密码哈希值(来自步骤16)与存储的密码哈希值进行比较。如果它们相同,则用户提供了正确的密码。
      18. Oracle Database 11g中的身份验证协议

        1. 客户端从服务器请求会话密钥,指定它希望连接的用户。
        2. 服务器生成服务器会话密钥。
        3. 服务器生成验证者数据。
        4. 服务器使用请求的用户密码哈希作为密钥加密服务器会话密钥。
        5. 服务器将加密的服务器会话密钥(" AUTH_SESSKEY")和验证者数据(" AUTH_VFR_DATA")发送给客户端。
        6. 客户端使用验证者数据作为盐来清空用户的密码。
        7. 客户端使用用户的密码哈希作为密钥解密加密的服务器会话密钥。
        8. 客户端生成客户端会话密钥。
        9. 客户端将客户端会话密钥与服务器会话密钥组合在一起。
        10. 客户端使用该用户的密码。
        11. 客户端使用组合的会话密钥(来自步骤9)作为其密钥来加密用户的盐渍密码。 (AES-192)
        12. 客户端使用用户的密码哈希作为密钥加密客户端会话密钥。
        13. 客户端将加密的客户端会话密钥和加密的盐渍用户密码发送到服务器。
        14. 服务器使用请求的用户密码哈希对加密的客户端会话密钥进行解密。
        15. 服务器将客户端会话密钥与其服务器会话密钥组合在一起。
        16. 服务器使用组合的会话密钥(来自步骤15)解密加密的盐渍密码作为密钥。
        17. 服务器取消盐渍密码。
        18. 服务器哈希解密后的密码。
        19. 服务器将计算出的密码哈希值(来自步骤18)与存储的密码哈希值进行比较。如果它们相同,则用户提供了正确的密码。