如何根据特定规范生成可能的密码组合以与哈希进行比较

时间:2018-12-20 07:04:39

标签: java hash passwords

我正在尝试生成一个字符串列表(可能的密码),然后可以对其进行哈希处理(SHA-256)以与我已经拥有的密码哈希进行比较。

我知道密码必须是一个受欢迎的男孩或女孩名字,没有指定大小写,后跟一个介于0到9999之间的数字,例如BoB167,AliCE1000,conNor99,tHe9329

如何生成可能的密码字符串,以便我可以对其进行哈希处理以与哈希进行比较

有人知道我可以从哪里开始吗?我在想创建一个可以吸收所有可能字符的方法,将每个组合添加到字符串中,但不确定如何做到这一点

1 个答案:

答案 0 :(得分:0)

您的问题有点太宽泛了,但是由于您在评论中指出您的问题是由名称的小写/大写字母组合而成的,因此我将在回答中解决这一部分。

  • 对于具有 n 个字符的给定名称,存在 2 n 个可能的大小写字母组合。
    例如。对于bob,有2 3 = 8种可能的组合。

  • 从0循环到 2 n 将产生 2 n 个连续整数。
    例如。对于bob,它将是0、1、2、3、4、5、6和7。

  • 这些整数的位模式可用于确定字符是否需要大写或小写。
    例如。对于bob,位模式将为000、001、010、011,依此类推。
  • 然后,您可以使用一点点移位魔术(从here借来)来确定整数中的 n th 位是否设置为生成实际的名称组合。

示例代码

public class Test {
    public static void main(String[] args) {
        combinations("bob");
    }

    private static void combinations(String name) {
        char[] chars  = name.toCharArray();

        for (int i = 0; i < Math.pow(2, chars.length); i++) {
            char[] result = new char[chars.length];

            for (int n = 0; n < chars.length; n++) {
                result[n] = isBitSet(i, n) ? Character.toUpperCase(chars[n])
                                           : Character.toLowerCase(chars[n]);
            }

            System.out.println(result);
        }
    }

    private static boolean isBitSet(int i, int n) {
        return ((i & (1 << n)) != 0);
    }
}

输出

这将产生以下输出:

bob
Bob
bOb
BOb
boB
BoB
bOB
BOB