什么';在Java中存储数据库密码(JDBC连接字符串中需要)的最佳方法是什么?

什么';在Java中存储数据库密码(JDBC连接字符串中需要)的最佳方法是什么?,java,jdbc,passwords,Java,Jdbc,Passwords,我目前正在开发一个Java应用程序,使用JDBC连接到Azure DB。这就是我当前的代码- File file = new File("filename.txt"); Scanner scanner = new Scanner(file); String pwd = scanner.nextLine(); String connectionUrl = "jdbc:sqlserver:{A link here};" + &qu

我目前正在开发一个Java应用程序,使用JDBC连接到Azure DB。这就是我当前的代码-

File file = new File("filename.txt");
      Scanner scanner = new Scanner(file);
String pwd = scanner.nextLine();

String connectionUrl =
    "jdbc:sqlserver:{A link here};" +
    "database={DBName}; +
    "user={UserName};" +
    "password=" + pwd + ";"
    "encrypt=true;" +
    "trustServerCertificate=false;" +
    "hostNameInCertificate=*.database.windows.net;" +
    "loginTimeout=30;";
我打算在完成后将这个项目公开上传到Github上,在那里设置纯文本密码显然是个糟糕的主意

然而,我不确定最好的方法是什么。我认为存储散列密码是行不通的,因为DB字符串需要明文形式的密码。我能想到的最好办法是将密码存储在文本文档中(以及其他几个单词/text),并使用IO reader/substrings/BufferedReader将其作为变量读取。这至少在一定程度上掩盖了它对普通读者的影响,但任何了解基本Java的人都将能够识别它(或者只是放一个简单的System.out.print(pwd))

看起来应该有更好的方法,但我还没有找到任何可行的解决方案来阻止用户打开文本文档/conf文件并读取密码。我希望保持连接完全自动化,因此不希望提示用户输入密码。 请回复如何实现这一目标


我是一名(大部分是自学的)学生,在Java方面的实践经验有限,因此,如果我错过了一个非常明显的解决方案,我深表歉意。

通常,这些值存储在系统环境变量中

例如,设置以下系统变量:

  • DATABASE\u URL=
  • DATABASE\u NAME=
  • DATABASE\u USER\u NAME=
  • DATABASE\u USER\u PASSOWRD=
  • 然后在代码中使用
    System.getProperty(“DATABASE\u URL”)
    等检索它们。 或者最好将所有连接URL存储在系统环境变量中:

  • DATABASE\u CONNECTION\u URL=jdbc:sqlserver:someUrl…
  • 您可以看到一些示例,例如如何在Azure中的或中设置系统环境变量。

    外部化配置信息 最好的方法是将部署时间配置外部化

    通过外部化配置信息,您不再负责维护该信息。部署Java应用程序的责任就在于此。当发生更改时,例如将数据库移动到另一台服务器,或者作为安全预防措施轮换密码,不需要更改代码库,也不需要程序员参与

    目录命名服务 有些服务器是为此目的而设计的,通常称为。您可以选择这样的服务器,既可以是开源的/免费的,也可以是商用的。此类服务器通常遵守协议

    JNDI Java为您的应用程序提供了一个与目录/命名服务器交互的接口,而无需在编译时了解特定的服务器。该接口被调用

    甲骨文提供了一个新的平台,尽管它现在可能已经过时了。也许这仍然是一个很好的免费方式来获得导向

    DataSource
    对于数据库连接配置信息,您通常会使用JNDI为实现接口的对象请求目录命名服务。然后您只需调用该对象上的方法。该方法向数据库返回一个值,您可以通过该值执行工作

    应用服务器 如果您正在构建应用程序,那么您的运行时容器(如Tomcat、Jetty、Glassfish、Payara、Wildfly、JBoss等)可能会捆绑一个目录命名服务的实现

    在运行时,应用服务器的系统管理员配置连接信息,例如数据库服务器网络地址、网络端口号以及数据库用户名和密码。该配置信息封装在通过JNDI获得的
    数据源
    对象中

    开始 如果您刚刚开始构建应用程序,则无需立即设置LDAP服务器、配置JNDI等等。以后再说吧

    开始时,只需使用
    数据源
    对象在整个代码库中获取数据库连接。在代码库中的某个地方,例如应用程序生命周期的启动,一个
    数据源
    对象。稍后,当您的应用程序接近完成时,您可以使用JNDI使用软编码切换硬编码的
    数据源
    对象,以获得
    数据源

    您可能包括一个
    数据源
    实现,用于硬编码。例如:

    • 对于Azure SQL数据库,通过,使用上列出的
      com.microsoft.sqlserver.jdbc.SQLServerDataSource
    • 对于,使用,将类用作
    • 对于,绑定了
      org.h2.jdbcx.JdbcDataSource