不可思议的Java字符串差异?

时间:2014-04-23 03:20:01

标签: java string

这是我在Stack Overflow上发布的第一个问题。我开发了一个应用程序,它将用户的文本以简单的加密形式存储在文本文件中。该应用程序还用于解密文本并根据用户的需求将其显示在屏幕上。下面的代码显示了我的" UnEncrypt"方法。该方法有效地将加密文本分成四个字符间隔。然后,它通过加密密钥方法运行这四个字符间隔,将四个字符转换为单个字符。我也有这种方法运行"测试"串。 "测试的价值" string是" 85jf"这对应于角色" t"在" UnKey"方法。现在出现问题:字符串" c"和"测试"两者都保持完全相同的值;然而,"测试"字符串被有效地转换为字符" t"和" c" string返回错误(" E")。我在下面列出了以下证据:" UnEncrypt"方法。所以在这里总结一下:字符串" test"和" c"具有完全相同的值,但是,这些值是以不同的方式创建的(如代码中所示)。当"测试"和" c"运行相同的方法" UnKey",返回两个不同的值。我的问题是为什么会这样?我需要" c"返回一个有效的字符,让我的应用程序工作。关于为什么会发生这种情况的唯一猜测是因为当for循环生成字符串" c"时,它在外部看起来相同,但是一些内部值是不同的,因此与我的方法不兼容" UnKey&#34 ;.我试图尽可能清楚。如果需要,请问我问题。在此先感谢您的帮助!编辑:字符串被传递到" UnEncrypt"是" 85jf"

    public static String UnEncrypt(String s){
    char one = 0;
    char two = 0;
    char three = 0;
    char four = 0;
    String c = "";
    String fnl = "";
    String test = "85jf";
    for(int i = 0; i<= ((s.length()/4)-1); i++){

        one = s.charAt((i*4)+0);
        c += one;
        two = s.charAt((i*4)+1);
        c += two;
        three = s.charAt((i*4)+2);
        c += three;
        four = s.charAt((i*4)+3);
        c += four;
        System.out.println(c);
        System.out.println(test);
        System.out.println(UnKey(test));
        System.out.println(UnKey(c));

        c = "";
    }
    return fnl;
}
public static char UnKey(String s){
    char rtrn = 0;
    if (s == "rtfg"){
        rtrn = 'a';
    }else if (s == "sefc"){
        rtrn = 'b';
    }else if (s == "escf"){
        rtrn = 'c';
    }else if (s == "wjvo"){
        rtrn = 'd';
    }else if (s == "wvke"){
        rtrn = 'e';
    }else if (s == "24fk"){
        rtrn = 'f';
    }else if (s == "35fs"){
        rtrn = 'g';
    }else if (s == "ceif"){
        rtrn = 'h';
    }else if (s == "5ue8"){
        rtrn = 'i';
    }else if (s == "544f"){
        rtrn = 'j';
    }else if (s == "09fj"){
        rtrn = 'k';
    }else if (s == "4f84"){
        rtrn = 'l';
    }else if (s == "34fr"){
        rtrn = 'm';
    }else if (s == "4ofo"){
        rtrn = 'n';
    }else if (s == "59e9"){
        rtrn = 'o';
    }else if (s == "fje3"){
        rtrn = 'p';
    }else if (s == "rewq"){
        rtrn = 'q';
    }else if (s == "3f55"){
        rtrn = 'r';
    }else if (s == "34kf"){
        rtrn = 's';
    }else if (s == "85jf"){
        rtrn = 't';
    }else if (s == "daf8"){
        rtrn = 'u';
    }else if (s == "5cr3"){
        rtrn = 'v';
    }else if (s == "34fr"){
        rtrn = 'w';
    }else if (s == "d390"){
        rtrn = 'x';
    }else if (s == "sef4"){
        rtrn = 'y';
    }else if (s == "54jf"){
        rtrn = 'z';
    }else if (s == "fr73"){
        rtrn = '1';
    }else if (s == "fr4r"){
        rtrn = '2';
    }else if (s == "seg7"){
        rtrn = '3';
    }else if (s == "u87i"){
        rtrn = '4';
    }else if (s == "436i"){
        rtrn = '5';
    }else if (s == "0et3"){
        rtrn = '6';
    }else if (s == "uti9"){
        rtrn = '7';
    }else if (s == "9i5t"){
        rtrn = '8';
    }else if (s == "675f"){
        rtrn = '9';
    }else if (s == "53d4"){
        rtrn = '0';
    }else if (s == "1432"){
        rtrn = ' ';
    }else{
        rtrn = 'E';
    }
    return rtrn;
}
Please enter the password...
pass
Select command from menu...
1. View Passwords
2. Create New Entry
1
85jf
85jf
t
E

1 个答案:

答案 0 :(得分:3)

这似乎是个糟糕的主意,我强烈建议您不要使用密码进行可逆转换。如果您的密码以可逆方式存储,则攻击者(可以访问该文件)可以撤消用户的密码。相反,目前的最佳做法是使用cryptographically secure hashSALT来阻止rainbow tables的攻击。另见现在古老的Shadow Suite

您是否知道pigeonhole principle?不可思议?那是你的提示Mr. Patinkin

修改,因为您添加了代码,

不要使用==来测试字符串相等性。使用Object类型进行引用相等性测试。您需要使用.equals()

if ("a" != new String("a")) {
  System.out.println("It is known."); // <-- There a GoT reference too.
}