当用于存储的哈希密码generateHash方法给出arrayIndexOutOfBounds

时间:2016-04-11 19:54:44

标签: java database hash salt

我正在尝试哈希密码以便在数据库中存储,但我仍然遇到了arrayIndexOutOfBounds错误。

我打电话给signup("Test","password"),输出是测试35 ..任何人都可以指出我正确的方向,谢谢!

public static void signup(String username, String password) {
    String saltedPassword = SALT + password;
    String hashedPassword = generateHash(saltedPassword);
    DB.put("username", hashedPassword);
}

public static String generateHash(String input){
    StringBuilder hash= new StringBuilder();
    try {
        MessageDigest sha = MessageDigest.getInstance("SHA-1");
        byte[] hashedBytes = sha.digest(input.getBytes());
        char [] digits = {'0','1','2','3','4','5','6','a','b','c','d','e','f'};
        for (int idx = 0; idx<hashedBytes.length; idx++) {
            byte b = hashedBytes[idx];
            hash.append(digits[(b & 0xf0)>>4]);
            hash.append(digits[b & 0x0f]);   //<<<<<<<------ Error on this line.
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return hash.toString();     
}

2 个答案:

答案 0 :(得分:4)

您缺少一些十六进制数字,因此数组索引(预期长度为16)失败。此

char [] digits = {'0','1','2','3','4','5','6','a','b','c','d','e','f'};

应该包括7,8和9之类的

char [] digits = {'0','1','2','3','4','5','6','7','8','9',
        'a','b','c','d','e','f'};

答案 1 :(得分:0)

您的数组索引将超出范围。您正在尝试访问仅包含13个元素的数组的第16个元素。

我怀疑你只是错过了数字阵列中的7,8和9。

char [] digits = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};