在不在程序中硬编码的情况下提供数据库密码

Giving database password without hardcoding it in the program

我们如何创建一个 JDBC 连接创建逻辑,不需要每次数据库凭据发生变化时都更改 java 代码?

注意::数据库的用户名和密码将由用户(具有特殊权限)提供...完整权限给他..

我的意思是, 数据库用户名、密码和其他详细信息通常在 java 程序中进行硬编码。我们还有哪些其他方法可以保留它,以便在更改凭据时无需更改 java 代码? 我们还必须牢记凭据的 隐私和安全因素 ...

您可以使用属性文件来存储所有凭据和数据库url。

  1. 将您的凭据存储在文件中 (credentials.properties)
  2. 如果您的程序启动,请读取文件

像这样:

Properties   properties = new Properties();
properties .load(new FileInputStream(new File("c:\credentials.properties")));

String user = properties.getProperty("username");
String pass = properties.getProperty("password");
//...

credentials.properties的内容是这样的:

#DB properties:
driver   = com.mysql.jdbc.Driver
url      = jdbc:mysql://localhost/mydatabase?useEncoding=true&characterEncoding=UTF-8
username = dit
password = 123456

您可以使用一些允许您从 XML 文件加载配置的库 - 我更喜欢 XStream。我的数据库配置保存在配置 XML 中,更改凭据后我唯一需要做的就是重新启动应用程序。

为了提高安全性,您可以将解密密钥硬编码到应用程序中,并将加密后的密码保存到配置文件中。

当我的应用程序启动时,我创建了一个 class 包含应用程序的所有配置:

public class ConfigurationUtils {
    public static final Config config;

    static {
        XStream xstream = new XStream();
        xstream.alias("config", Config.class);
        xstream.alias("proxy", Proxy.class);
        xstream.alias("database", Database.class);
        xstream.alias("mailServer", MailServer.class);

        // Check if a configuration file exists, otherwise use the config from the resources
        File file = new File("/etc/applicationname/config.xml");

        if(file.exists()) {
            config = (Config) xstream.fromXML(file);
        } else {
            ClassLoader classloader = Thread.currentThread().getContextClassLoader();
            InputStream is = classloader.getResourceAsStream("config.xml");
            config = (Config) xstream.fromXML(is);
        }
    }
}

引用的 classes 是简单的数据 classes 由私有属性、getter 和 setter 组成,它们与 config.xml 中的名称相匹配 - XStream 处理映射XML 值到 class.

如果你的程序是交互式程序,你会弹出一个对话框,可以从用户那里获取用户名和密码。如果是命令行程序,可以在命令行指定用户名和密码,然后在'publicstatic void main(String[] args)方法中的'args'变量中访问这些值。如果它是一个没有用户交互的批处理程序,你可以使用上面其他贡献者提到的任何方法。

这就是我会做的。声明一下,我只玩玩具。

  • 数据库 < 服务
  • 服务
    • 解密来自客户端的流量
    • 有一个“config”或“properties”文件,其中包含与数据库交互的用户名和密码。
    • 可以根据您的安全需求以您喜欢的方式响应

其他地方:

  • 客户 > 服务
    • 用户可以登录。
    • 登录用户然后可以向服务发送请求或提交数据
    • 该服务将决定如何响应,在数据库中创建一个日志记录您所做的查询以及来自何处以及如果它符合您的最少访问控制模型的规范,该服务将执行您的需求。

该服务还将负责清除进入的不良信息。

然后,您可以将此交互与单一登录功能相关联,该功能与 window 或 linux 的用户和组控件相关联,例如 UUID,甚至可以将其滑入cookie 形式的网络应用程序。

您的“用户名”和“密码”不再对任何通常无法访问的人可见。

我想这可能是公司的做法,但我不知道,因为我很少知道我在说什么,因此我不被录用。