Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Функция для генерации паролей

28K
14 июля 2008 года
Tirpitz
32 / / 05.05.2008
Есть ли в Win32 API функция для генерации паролей? Или, вернее, где ее найти?
12K
14 июля 2008 года
lifs
163 / / 06.09.2007
Нет. Можно самому написать, используя rand() или какие-либо случайне события(мышка, клава, число тактов). Можно взять готовую, например из pwgen, truecrypt, keepass. Можно погуглить.
28K
14 июля 2008 года
Tirpitz
32 / / 05.05.2008
Побродил по MSDN по разделу "Win32 and COM development" > "Security" > "Cryptography" и нашел функцию CryptGenRandom(), которая заполняет буфер "криптографически случайными байтами". Попробую использовать ее.
12K
14 июля 2008 года
lifs
163 / / 06.09.2007
так она сгенерит байты из диапозона 0-255, а для пароля это не подходит
28K
14 июля 2008 года
Tirpitz
32 / / 05.05.2008
Ну, если в массиве байтов szPswd уже есть случайные значения в диапазоне от 0 до 255, то дальше не сложно дописать что-то вроде:
 
Код:
char szSymbols[PSWD_SYMBOLS_COUNT] = { '0', '1', ... , 'A', ..., 'z' };

for (i = 0; i < 16; i++)
{
     szPswd = szSymbols[szPswd % PSWD_SYMBOLS_COUNT];
}
12K
14 июля 2008 года
lifs
163 / / 06.09.2007
szPswd : 0 - 255. Если 256 % PSWD_SYMBOLS_COUNT != 0, то какие-то символы будут встречаться чаще других, а именно - первые в списке.
28K
15 июля 2008 года
Tirpitz
32 / / 05.05.2008
Интересно, почему? Если не сложно, то может укажешь свои соображения? Или это из раздела теории вероятностей или математической статистики?
5
15 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Tirpitz
Интересно, почему? Если не сложно, то может укажешь свои соображения?

Валидных символов у нас: от 0 до 9 - 10, от a до z - 26 + в верхнем регистре. Итого 10 + 26 + 26 = 62. ГПСЧ возвращает нам набор из из чисел в интервале от 0 до 255. Если мы будем пользоваться операцией взятия остатка (модулем), то оцените сами - у нас первые числа будут встречаться чаще, так как эта операция как бы "зацикливает" набор чисел и "хвост" цикла будет попадать какраз на первые символы.
Задачу корректнее решать используя отображение интервала [0, 255] в интервал [0, 61] (преобразовывать больший интервал в меньший можно - это не уменьшает энтропию) Т.е. используем формулу:
index = round(rnd_index * (61.0 / 255.0))

12K
15 июля 2008 года
lifs
163 / / 06.09.2007
Все равно неравномерно получается. У некоторых элементов вероятность выпадения больше чем у других (примерно на 1/256, пустяк конечно, но все же).

По поводу генерации. В принципе в простом случае подойдет и то, что предложил hardcase и rand() (например, моэно добавить модификации: на 5-9-15 символах переинициализировать засчет системного времени или числа тактов или еще чего-нибудь).

Если же последовательность нужна серьезнее, то тогда лучше использовать пул энтропии, постоянно поддерживая его в актуальном состоянии. А уже данные из него использовать для генерации случайной последовательности. Реализаций много, так что найти пример не составит проблемы.
28K
15 июля 2008 года
Tirpitz
32 / / 05.05.2008
Понял: если диапазон случайных чисел от 0 до 255 (всего 256), а количество допустимых символов в пароле - 83, то имеем: 256 = 83 * 3 + 7. Т.е. при делении индекса большего интервала (0...255) по модулю 83, получим что каждый из индексов мешьшего интервала (0...82) встретится ровно три раза плюс еще по одному разу встретятся семь первых индексов меньшего интервала.
28K
15 июля 2008 года
Tirpitz
32 / / 05.05.2008
Пробовал также и "отображать интервалы" - умножать индекс на коэффициент 82/256 и округлять до ближайшего целого (не до ближайшего меньшего целого, а именно по математическим правилам). В итоге - все индексы повторяются ровно три раза за исключением опять же семи (которые, правда, теперь разбросаны внутри интервала), встретившихся четыре раза, и индекса 0 - встретившегося два раза.
12K
15 июля 2008 года
lifs
163 / / 06.09.2007
Во-первых, надо 82/255. Во-вторых вполне логично, что ноль выпадает реже. 0 получится только в двух случаях - когда в байте будет 0 или 1. при 2ке округление будет в 1. Эти 7 индексов и должны выпадать чаще с вероятностью 1/256 каждый, только сейчас они уже разбросаны по интервалу.
Если вас все же не устраивает использования пула энтропии или невозможно снизить чилсо возможных символов до числа кратного 256. То как вариант могу предложить это. Пусть при выпадении числа от 0 до 248 (83*3 - 1) выбирается соответствующий символ из 83. если выпадет от 249 до 255 выбирается любой символ из 83, например, с помощью ранд. Тогда с вероятностью 249/256 выпадает один из трех символов и с вероятностью 7/256 мы проводим выборку еще раз. При такой комбинации 7 символов опять будут чаще других встречаться, но при этом каждый раз разные.
28K
15 июля 2008 года
Tirpitz
32 / / 05.05.2008
82/256 - это опечатка. Конечно, 82/255. Просто интересно было сравнить результаты деления по модулю и "отображения интервалов" именно в моем случае с моими исходными данными.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог