提供数据库密码而无需在程序中对其进行硬编码

时间:2015-03-24 07:37:55

标签: java jdbc

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

注意::数据库的用户名和密码将由用户(具有特殊权限)给出...给予他完整的权限.. < / p>

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

5 个答案:

答案 0 :(得分:1)

  1. 将您的凭据存储在文件(credentials.properties)
  2. 如果您的程序启动,请阅读该文件
  3. 像这样:

    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
    

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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);
        }
    }
}

引用的类是简单的数据类,包含与config.xml中的名称匹配的私有属性,getter和setter - XStream处理XML值到类的映射。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这就是我要做的。需要说明的是,我只玩玩具。

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

其他地方:

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

该服务还将负责清除进入时的不良情况。

然后,您可以将此交互与单点登录功能相关联,该功能与窗口或 Linux 的用户和组控件相关联,使用 UUID 之类的东西,甚至可以将其以 cookie 的形式滑入网络应用程序。

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

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