2017 [11] Хеш-значения
Политика безопасности ОС не позволяет задавать для учетных записей пользователей пароли, совпадающие с их именами. Для этого перед добавлением нового пользователя в базу вызывается функция CheckUser(). При ее успешном выполнении (возвращаемое значение = 0) в базу добавляется новая запись, содержащая имя учетной записи пользователя и хеш-значение пароля, полученное с помощью функции Hash().
Си |
int CheckUser(char* username, char* password) { for (int i=0; i<strlen(username); i++) { if ( (username[i] >= 0x30 &&
(username[i] >= 0x41 &&
(username[i] >= 0x61 &&
) continue; else return 1; } for(int i=0; i<strlen(password); i++) { if (password[i] >= 0x23 &&
continue; else return 1; } if (stricmp(username, password) != 0) return 0; else return 1; } |
const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";
char* Hash(char* str) { const int p = 19; int Nstr = 32; const int Hsize = Nstr / 2; unsigned short int hash = 0, p_pow = 1; char *buf = new char[Nstr + 1]; int size = 0; char *res = new char[Hsize + 1]; while (str[size] != '\0' && size < Nstr) { buf[size] = str[size]; size++; } for (int i = size; i < Nstr; i++) { buf[i] = '0' + (i - size); } buf[Nstr] = '\0'; for (int i = 0; i < Nstr; i+=2) { hash += (buf[i] - '0' + 1) * p_pow; p_pow *= p; hash += (buf[i + 1] - '0' + 1) * p_pow; p_pow *= p; res[i / 2] = letters[hash % strlen(letters)]; } res[Hsize] = '\0'; return res; } |
Администратор периодически выполняет проверку базы пользователей и блокирует учетные записи, хеш-значения от имени которых совпадают с хеш-значениями их паролей. Приведите пример имени и пароля для учетной записи, которая удовлетворяет заданной политике безопасности, но будет заблокирована администратором в ходе проверки, и обоснуйте почему.