Политика безопасности ОС не позволяет задавать для учетных записей пользователей пароли, совпадающие с их именами. Для этого перед добавлением нового пользователя в базу вызывается функция CheckUser(). При ее успешном выполнении (возвращаемое значение = 0) в базу добавляется новая запись, содержащая имя учетной записи пользователя и хеш-значение пароля, полученное с помощью функции Hash().
int CheckUser(char* username, char* password) { for (int i=0; i { if ( (username[i] >= 0x30 &&
(username[i] >= 0x41 &&
(username[i] >= 0x61 &&
) continue; else return 1; } for(int i=0; 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=31; const int Nstr=32; const int Hsize=Nstr/2; unsigned short int hash=0, p_pow=1; char buf[Nstr+1]={0}; int size=0; char *res=new char[Hsize+1]; while (str[size]!='\0' && size { buf[size]=str[size]; size++; }
for (int i=size; i { buf[i]='A'+(i-size); } for (int i=0; i { hash+=(buf[i]-'a'+1)*p_pow; res[i/2]=letters[hash%strlen(letters)]; p_pow*=p; } res[Hsize]='\0'; return res; }
В базе пользователей присутствуют следующие записи: admin rUZxHUUfw9oJSFNm user vYhkB2klurVYYPtq operator pS8HIUqmrJ60ZOrk manager ng3JfGZ0TQzmCtS5 root sQUsDRwnsAf90HN0 В ходе проверки администратор выявил случаи возможного нарушения политики безопасности.
Определите: 1. пользователей, для которых были обнаружены нарушения; 2. причины возникновения нарушений. |
for (int i = 0; i < Nstr; i+=2)
{
hash += (buf[i] - 'a' + 1) * p_pow;
res[i/2] = letters[hash % strlen(letters)];
p_pow *= p;
}
видно, что в вычислении результирующего хеш-значения (переменная res) участвуют только четные (начиная с 0) символы пароля (i = 0 … i+=2 … buf[i] …).
Таким образом, вычислив хеш-значения пароля для имен учетных записей всех пользователей, получаем, что для пользователей operator и manager произошло нарушение.