在客户端服务器应用程序中:如何将用户的应用程序密码发送到DB?

时间:2020-03-05 18:55:21  来源:igfitidea点击:

我有一个Java桌面应用程序,该应用程序直接与DB(Oracle)连接。该应用程序具有多个用户帐户。通过网络发送用户密码(不是数据库密码)的正确方法是什么?我不想用纯文本发送

解决方案

回答

如果我们不想以纯文本格式发送数据,请使用加密!!!

使用某种加密算法,例如AES,Twofish等。

我们还必须考虑客户端和服务器的位置。如果它们都在同一台计算机上,则不会使用加密。如果它们位于不同的计算机中,请使用某种加密算法来发送敏感数据。

如果我们要检查密码的有效性,则只需发送密码的哈希值即可。请注意,仅当我们自己比较密码时,此方法才有效。如果某个其他应用程序(不受我们控制)正在执行验证工作,则无法对密码进行哈希处理。

回答

我们可以通过安全的套接字连接进行连接,也可以在将密码发送到数据库之前在本地对密码进行哈希处理(或者更好的做法是两者都进行)。理想情况下,密码应以纯文本形式存在的唯一时间是在哈希处理之前。如果我们可以在客户端执行所有这些操作,那就更好了。

回答

同意,切勿以明文形式发送用户选择的密码。但是,如果不使用公钥加密,则如果我们通过电子邮件向他们发送密码,密码将采用明文形式。我经常看到的一件事是,当用户忘记密码并要求将密码发送给他们时,系统会生成一个新密码并将该密码发送给用户。然后,用户可以更改密码。

这样,用户选择的密码(用户可能会在其他地方使用的密码)将永远不会发送,而他们的临时密码是以明文形式发送的,他们应该在不久后进行更改。

回答

我们可以在Oracle客户端和Oracle数据库之间使用SSL连接。要使用JDBC在Oracle客户端和服务器之间配置SSL,请执行以下操作:

在服务器端:

1)首先,必须将侦听器配置为使用TCPS协议:

LISTENER = (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcps)(HOST=servername)(PORT=2484)))

WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/server/wallet/path/)))

在客户端:

1)以下罐子需要是classpath
ojdb14.jar,oraclepki.jar,ojpse.jar

2)用于连接的URL应为:
jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS =(PROTOCOL = tcps)(HOST = servername)(PORT = 2484))(CONNECT_DATA =(SERVICE_NAME = servicename)))

3)需要设置以下属性(作为系统属性(-D选项)或者要连接的属性)
javax.net.ssl.trustStore,
javax.net.ssl.trustStoreType,
javax.net.ssl.trustStorePassword

参考:http://www.oracle.com/technology/tech/java/sqlj_jdbc/pdf/wp-oracle-jdbc_thin_ssl_2007.pdf

回答

如果直接连接到没有中间层的数据库,则应考虑为每个实际用户使用一个数据库用户,因为否则我们将无法真正确保应用程序的访问安全。

如果使用ORa * Net连接到Oracle,则用户密码将自动加密(自Oracle 8开始),但是在某些情况下,它可能会退回到未加密的密码。可以在客户端环境中使用ORA_ENCRYPT_LOGIN = true禁用此功能。