【发布时间】:2015-05-28 16:15:38
【问题描述】:
我正在尝试对我的 JDBC 连接实施最佳安全实践。 我读到实现密码的最佳方法是使用字符数组,而不是字符串,因为字符串在 Java 中是不可变的。
唯一的问题是,我在 Java API 中找不到任何支持隐藏char[] 类型密码的方法。
有什么建议吗?
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JOptionPane;
import javax.swing.JLabel;
public class DbConnect
{
public static void main(String args[])
{
try
{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = null;
Statement stmt = null;
String username = "";
String sPassword = "";
char[] cPassword;
JTextField usernameField = new JTextField(50);
JPasswordField passwordField = new JPasswordField(20);
JPanel loginPanel = new JPanel();
loginPanel.add(new JLabel("Username:"));
loginPanel.add(usernameField);
loginPanel.add(Box.createHorizontalStrut(15));
loginPanel.add(new JLabel("Password:"));
loginPanel.add(passwordField);
int result = JOptionPane.showConfirmDialog(null, loginPanel,
"Please Enter Username and Password", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
username = usernameField.getText();
cPassword = passwordField.getPassword();
//password = passwordField.getText();
for(int c = 0; c < cPassword.length; c++)
sPassword = sPassword + cPassword[c];
/*conn = DriverManager.getConnection("jdbc:mysql://x.x.x.x");*/
conn = DriverManager.getConnection("jdbc:mysql://x.x.x.x", username, sPassword);
System.out.print("Database is connected\n");
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT Fld1, Fld2, Fld3, Fld4 FROM db.tbl";
ResultSet rs = stmt.executeQuery(sql);
【问题讨论】:
-
为什么不转换它以隐藏?
-
不变性和密码安全有什么关系?为什么要更改密码对象?
-
@Alexander - 这个想法是密码保留在内存中,并且在垃圾收集之前不会从中删除,因此黑客可以在很长一段时间内入侵您的内存空间。使用可变对象,您实际上可以在完成后立即将内存清零。
-
由于字符串不可变,它将在内存中浮动,直到 gc 来找它。如果将 char[] 设置为 null,则可以更快地销毁对象。
-
@TripWire - 将其设置为 null 与
String相比将无济于事。它将每个元素设置为\u0000或其他可以解决问题的方法。
标签: java arrays string jdbc connection