Алгоритм проверки последовательных букв в QWERTY-клавиатуре - PullRequest
2 голосов
/ 13 марта 2019

Мне нужно написать алгоритм на Java для проверки поля пароля. Между всеми основными элементами управления (минимальная длина, lunghezza massima, буквенно-цифровые ...) я должен проверить, что пароль не состоит из последовательных символов с клавиатуры (например, QWERTY, YTREWQ, ASDFGH и т. Д.). Минимальная длина пароля составляет 8 символов. Пароль дисквалифицируется после 4 цифр Я не могу создать «словарную таблицу» в моей БД с «запрещенными» строками, любой подсказкой о существующем алгоритме или если библиотека уже выполняет такую ​​проверку?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Хорошо, вот мое решение, кажется, оно хорошо работает для горизонтальной проверки. Если расстояние> 4, это означает, что пароль недействителен. Любой совет, чтобы улучшить это? Я знаю, что это немного жестко, но сейчас я могу передать это.

    @Test
public void runCheckDigit() {

    checkdigit("cnqwerty13");

}

public void checkdigit(String password) {

    int x = 4;
    int y = 10;

    String[][] keyboard = new String[x][y];


    // first row
    keyboard[0][0] = "1";
    keyboard[0][1] = "2";
    keyboard[0][2] = "3";
    keyboard[0][3] = "4";
    keyboard[0][4] = "5";
    keyboard[0][5] = "6";
    keyboard[0][6] = "7";
    keyboard[0][7] = "8";
    keyboard[0][8] = "9";
    keyboard[0][9] = "0";

    // second row
    keyboard[1][0] = "q";
    keyboard[1][1] = "w";
    keyboard[1][2] = "e";
    keyboard[1][3] = "r";
    keyboard[1][4] = "t";
    keyboard[1][5] = "y";
    keyboard[1][6] = "u";
    keyboard[1][7] = "i";
    keyboard[1][8] = "o";
    keyboard[1][9] = "p";
    // TERZA RIGA
    keyboard[2][0] = "a";
    keyboard[2][1] = "s";
    keyboard[2][2] = "d";
    keyboard[2][3] = "f";
    keyboard[2][4] = "g";
    keyboard[2][5] = "h";
    keyboard[2][6] = "j";
    keyboard[2][7] = "k";
    keyboard[2][8] = "l";
    keyboard[2][9] = "ò";
    // third row
    keyboard[3][0] = "z";
    keyboard[3][1] = "x";
    keyboard[3][2] = "c";
    keyboard[3][3] = "v";
    keyboard[3][4] = "b";
    keyboard[3][5] = "n";
    keyboard[3][6] = "m";
    keyboard[3][7] = ",";
    keyboard[3][8] = ".";
    keyboard[3][9] = "-";

    printMatrix(keyboard, x, y);

    List<Coordinata> cList = new ArrayList<Coordinata>();

    for (int i = 0, n = password.length(); i < n; i++) {
        char s = password.toLowerCase().charAt(i);
        cList.add(getCoordinate(s, keyboard));
    }
    int distanza = 0;

    for (int i = 0; i < cList.size()-1; i++) {
        distanza = distanza + distanceElement(cList.get(i), cList.get(i + 1));
    }

    System.out.println("distanza : " + distanza);
}


private static Coordinata getCoordinate(char s, String[][] keyboard) {
    Coordinata c = null;
    for (int i = 0; i < keyboard.length; ++i) {
        for (int j = 0; j < keyboard[0].length; ++j) {
            if (keyboard[i][j].equals(Character.toString(s))) {
                // Found the correct i,j 
                return c = new Coordinata(i, j, Character.toString(s));
            }
        }
    }
    return c;
}

private static int distanceElement(Coordinata c1, Coordinata c2) {
    int distance = 0;       
    distance = Math.abs(c2.getX() - c1.getX()) + Math.abs(c2.getY() - c1.getY());
    System.out.println("Distance: " + c1.getLettera() + "->" + c2.getLettera() + " = " + distance);     
    return distance;
}

private static void printMatrix(String[][] matrix, int matrixRow, int matrixCol) {
    System.out.println("Matrix is : ");
    for (int i = 0; i < matrixRow; i++) {
        for (int j = 0; j < matrixCol; j++) {
            System.out.print(matrix[i][j] + "\t");
        }
        System.out.println();
    }
}
0 голосов
/ 13 марта 2019

Хм ... Одна вещь приходит на ум.

Вы можете попытаться построить матрицу букв:

-----------------------
| q  w  e  r  t  y  ... 
| a  s  d  f  g  h  ... etc.
| z  x  c  v  b  n  ... 
-----------------------

Дайте каждой букве указатель. Например, «q» имеет [1,1], «w» имеет [2, 1], «v» имеет [4,3] и т. Д.

Теперь, учитывая строку, найдите расстояние между каждой буквой и сложите их.

Пример:
Дана строка "sdgh":

s-d, distance is 1
d-g, distance is 2
g-h, distance is 1

Total distance is: 4

Теперь у вас есть соотношение 4/4. (Четыре буквы, общее расстояние четыре).
Это нормально с вашими требованиями безопасности? Ответьте на этот вопрос, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...