Здравствуйте, 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 байт входа на один символ выхода) но работает.