Re: Случайный пароль
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.05.23 10:40
Оценка: +1
Здравствуйте, TailWind, Вы писали:

TW>Как сделать случайный пароль на 24 символа?

TW>И потом ещё один такой же

TW>Нужно чтобы между символами и паролями не было математической зависимости


Когда говоришь о "случайных значениях", надо в первую очередь определить, требуется ли максимально непредсказуемая случайность, или нужно таки получить воспроизводимость.
Раз речь о паролях — то скорее первое.
Тогда второе это какая платформа.
В современных Unix типа Linux, MacOS самый простой и надёжный вариант это открыть /dev/urandom, прочитать нужное количество байт из него (они будут равномерно распределёнными значениями от 0 до 255, независимые друг от друга) и из них сгенерировать что нужно.
Для винды мне подсказывают про CryptGetRandom(), но я не проверял.

TW>То есть rand(), rand(), rand(), rand() не подходит


TW>Единственное, что мне пришло в голову rand(GetTickCount())

TW>Но этого мало. А дальше то как?

И какой набор символов?
Вот что-то вроде подобного я бы сделал для Linux

static const char PASSWORD_CHARS[] = "0123456789abcdefghijklmnopqrstuvwxyz"; // подправить по вкусу
static size_t PASSWORD_CHARS_COUNT = sizeof(PASSWORD_CHARS) - 1;

static inline uint64_t getOneNumber(int fd) {
  uint64_t n;
  if (read(fd, &n, sizeof n) != sizeof n) { abort(); }
  return n;
}

void gen_password(char* obuf, size_t osize) { // NB не терминирует NUL
  int fd = open("/dev/urandom", O_RDONLY, 0); if (fd == -1) { abort(); }
  for (size_t idx = 0; idx < osize; ++idx) {
    uint64_t n = getOneNumber(fd);
    obuf[idx] = PASSWORD_CHARS[n % PASSWORD_CHARS_COUNT];
  }
  close(fd);
}


Топорно (целых 8 байт входа на один символ выхода) но работает.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.