什么';在Java中存储数据库密码(JDBC连接字符串中需要)的最佳方法是什么?
我目前正在开发一个Java应用程序,使用JDBC连接到Azure DB。这就是我当前的代码-什么';在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
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…
DataSource
对于数据库连接配置信息,您通常会使用JNDI为实现接口的对象请求目录命名服务。然后您只需调用该对象上的方法。该方法向数据库返回一个值,您可以通过该值执行工作
应用服务器
如果您正在构建应用程序,那么您的运行时容器(如Tomcat、Jetty、Glassfish、Payara、Wildfly、JBoss等)可能会捆绑一个目录命名服务的实现
在运行时,应用服务器的系统管理员配置连接信息,例如数据库服务器网络地址、网络端口号以及数据库用户名和密码。该配置信息封装在通过JNDI获得的数据源
对象中
开始
如果您刚刚开始构建应用程序,则无需立即设置LDAP服务器、配置JNDI等等。以后再说吧
开始时,只需使用数据源
对象在整个代码库中获取数据库连接。在代码库中的某个地方,例如应用程序生命周期的启动,一个数据源
对象。稍后,当您的应用程序接近完成时,您可以使用JNDI使用软编码切换硬编码的数据源
对象,以获得数据源
您可能包括一个数据源
实现,用于硬编码。例如:
- 对于Azure SQL数据库,通过,使用上列出的
类com.microsoft.sqlserver.jdbc.SQLServerDataSource
- 对于,使用,将类用作
- 对于,绑定了
类org.h2.jdbcx.JdbcDataSource