【问题标题】:replacing hard coded credentials替换硬编码凭据
【发布时间】:2018-11-27 22:25:29
【问题描述】:

我构建了一个简单的 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命名约定:包、属性、变量、参数、方法必须以lowerCase开头,而类、接口应以UpperCase开头> && 不需要拆分声明和赋值,一行就可以搞定
  • 解决方法:hash密码,只保留这个hash,然后输入passwd后,hash并比较是否相等。但是,如果您是“菜鸟”,则不应从此类问题开始,因为您可能没有构建需要此类安全性的应用程序;)
  • @azro OP 还应该对密码加盐以使其更安全。
  • @SamzSakerz 当然可以,但我认为引入太多东西只会增加混乱,如果概念是新的,那就从小处着手
  • 你看到String[] args了吗?它允许您在命令行上键入信息(例如,凭据)并在您的 Java 程序中读取它们。

标签: java


【解决方案1】:

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

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

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

【讨论】:

  • 我可以选择为凭据创建单独的文件吗?我认为它可能会起作用,但我不认为我在某处遗漏了一点:
  • 当然,创建一个名为credentials.txt 的文件并将密码和/或用户名放入其中。您的应用程序需要从文件中读取密码,并将其与登录期间的用户输入进行比较。但是,无论您将密码(代码、文件、数据库等)存储在何处,您都只是在转移问题。你仍然有一个未加密的密码 somewhere 除非你散列它。
  • 作为散列算法的一个例子,Spring 提供了一个相对常见的称为 BCrypt 的算法。 dzone.com/articles/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2018-12-11
  • 2019-07-06
  • 2018-07-18
相关资源
最近更新 更多