首页 > 解决方案 > 替换硬编码凭据

问题描述

我构建了一个简单的 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"; 用户名 = "管理员"; 简单的东西,但我迷路了。对不起..

标签: java

解决方案


通常,密码甚至不会存储在应用程序代码中——它们将根据数据库或其他数据源进行验证。但是暂时把这些担忧放在一边……

您的问题的答案是使用单向哈希。即用不可逆转的散列函数对密码进行加密。当用户输入密码时,对其进行散列并将其与存储在应用程序代码中的散列进行比较。(用变量替换password变量passwordHash。)因为散列不能(容易)解密,所以它比将纯文本密码存储在应用程序源(或数据库,或任何其他可能存储散列密码的地方)中更安全。

正如其他人所暗示的那样,加密哈希(和应用程序安全性)会很快变得复杂,并且对于初学者来说并不是特别友好。所以这个答案可能会帮助你理解一些概念,但你可能需要更多的东西来保护生产质量的应用程序。


推荐阅读