java - 替换硬编码凭据
问题描述
我构建了一个简单的 java 应用程序。但是,我不明白如何保护这个应用程序以避免反编译器无法揭示的硬编码密码。
登录主
import java.util.Scanner;
public class LoginMain {
public static void main(String[] args) {
String Username;
String Password;
Password = "admin";
Username = "admin";
Scanner input1 = new Scanner(System.in);
System.out.println("Enter Username : ");
String username = input1.next();
Scanner input2 = new Scanner(System.in);
System.out.println("Enter Password : ");
String password = input2.next();
if (username.equals(Username) && password.equals(Password)) {
System.out.println("Access Granted! Welcome!");
} else if (username.equals(Username)) {
System.out.println("Invalid Password!");
} else if (password.equals(Password)) {
System.out.println("Invalid Username!");
} else {
System.out.println("Invalid Username & Password!");
}
}
}
LoginNew.java
import java.util.Scanner;
public class LoginNew {
public static void main(String[] args) {
String Username;
String Password;
Scanner scan = new Scanner (new File("1.txt"));
Scanner input1 = new Scanner(System.in);
System.out.println("Enter Username : ");
String username = input1.next();
Scanner input2 = new Scanner(System.in);
System.out.println("Enter Password : ");
String password = input2.next();
if (username.equals(Username) && password.equals(Password)) {
System.out.println("Access Granted! Welcome!");
} else if (username.equals(Username)) {
System.out.println("Invalid Password!");
} else if (password.equals(Password)) {
System.out.println("Invalid Username!");
} else {
System.out.println("Invalid Username & Password!");
}
}
}
但是,系统向我显示:
loginNew.java:9: error: cannot find symbol
Scanner scan = new Scanner (new File("1.txt"));
^
symbol: class File
location: class loginNew
1 error
Error: Could not find or load main class loginNew
我用我的凭据创建了文件 1.txt: Password = "admin"; 用户名 = "管理员"; 简单的东西,但我迷路了。对不起..
解决方案
通常,密码甚至不会存储在应用程序代码中——它们将根据数据库或其他数据源进行验证。但是暂时把这些担忧放在一边……
您的问题的答案是使用单向哈希。即用不可逆转的散列函数对密码进行加密。当用户输入密码时,对其进行散列并将其与存储在应用程序代码中的散列进行比较。(用变量替换password
变量passwordHash
。)因为散列不能(容易)解密,所以它比将纯文本密码存储在应用程序源(或数据库,或任何其他可能存储散列密码的地方)中更安全。
正如其他人所暗示的那样,加密哈希(和应用程序安全性)会很快变得复杂,并且对于初学者来说并不是特别友好。所以这个答案可能会帮助你理解一些概念,但你可能需要更多的东西来保护生产质量的应用程序。
推荐阅读
- c# - Azure 应用服务处理编码加号登录 URL 错误
- sql-server - 根据参数选择在带参数的两个报表之间切换
- html - bootstrap 4 文件输入按钮显示内联块
- c# - C# List to DataTable 扩展方法不检索属性
- dart - 在 Flutter 中使用 Mixins
- r - R data.table:如何获取 data.table 列中的所有可区分值?
- f# - 尽管程序正常运行,但类型提供程序“ProviderImplementation.JsonProvider”报告了一个错误
- r - 查找矩阵之间的公共值并返回具有行列位置的矩阵
- python - 如何在 python 中使用 Dash Plotly 更新间隔上的 xaxis 和 yaxis 名称?
- java - 如何显示图像导入到我网站根目录的文件夹