[英]Code showing username and password for connecting to server
我正在编写一种方法,使我的 Java 程序可以创建一个数据库连接,最终使我能够从其他类/方法访问它。
public class DatabaseConnection
{
private Connection databaseLink;
public Connection getConnection()
{
String url = "jdbc:mysql://localhost/DBname";
try
{
Class.forName("com.mysql.cj.jdbc.Driver");
databaseLink = DriverManager.getConnection(url, "fakeUsr", "fakePsw"); //these are not the real username/password
}
catch (Exception e)
{
e.printStackTrace();
}
return databaseLink;
}
}
我有几个问题:1)自从我写了“localhost”后,不使用我的电脑的人将无法进入我的服务器:
String url = "jdbc:mysql://localhost/DBname";
2) 我输入了真实的用户名和密码,而不是“fakeUsr”和“fakePsw”。 问题是:我很确定我的程序的普通用户不应该能够访问该信息。 有没有其他方法允许访问数据库而不让几乎任何访问我的源代码的人都可以读取用户名和密码?
对于问题 n。 1:我试着在这里输入我的 IP 地址而不是“localhost”: String url = "jdbc:mysql://localhost/DBname"; //changed localhost to my IP address
String url = "jdbc:mysql://localhost/DBname"; //changed localhost to my IP address
但后来我得到“通信链接失败”。
对于问题 n。 2:我真的不知道如何解决这个问题。 我从来没有编写过需要访问数据库的程序,所以我不得不为此即兴创作。
关于问题 #2:
没有安全的方法将密码存储在代码本身中。 您当然可以尝试加密密码,但是您的代码必须在建立连接时对其进行解密,因此加密密钥几乎“对所有有权访问您的源代码的人”都是可见的。 有了这个密钥,就可以得到真正的密码,只是稍微复杂一点。
唯一安全的方法是让用户自己输入登录凭据。 低级别(启动应用程序时程序 arguments)或某种形式的“登录对话框”,如果应用程序有 GUI。
第三种选择是创建一个具有受限数据库访问权限的技术用户,具体取决于您正在处理的应用程序。 但这通常会导致安全问题。
您可以创建您的应用程序,使其发送 https 请求并针对网络服务器进行身份验证。 您使用什么来进行身份验证取决于您:客户端 IP、用户名、密码、客户端证书……
一旦通过身份验证,您的网络服务器可以传输客户端用于登录到您的数据库的一次性用户名/密码。
这里的优点是您仍然可以控制用户是获得完全访问权限还是受限访问权限,或者出于任何原因不再获得密码。 而且您的应用程序中没有安全漏洞。
1) 大多数 Inte.net 提供商不允许普通用户接受传入的套接字连接,这既是出于安全原因,也是因为.network 流量会很快淹没消费级.networks。 您将不得不购买允许传入连接的商业互联网连接,或者寻找可以租赁或借用的服务器。 恐怕我不知道有哪些选择。
2) 正如 MrFreeze 正确指出的那样,没有办法在应用程序中安全地嵌入凭据。 无论您做什么来隐藏您的数据库登录凭据,总有人可以反编译您的程序并弄清楚您是如何解密这些凭据的。 唯一真正安全的解决方案是告诉用户您信任凭据是什么,然后编写您的应用程序以便用户必须输入它们。
旁注: Class.forName("com.mysql.cj.jdbc.Driver");
多年来一直不需要。 您可以删除该行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.