Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Что думаете об этом генераторе паролей на основе псевдослучайных чисел? Щас объясню свою идею. Смысл в том, что можно

Борисик Пчелинцев Ученик (93), открыт 3 часа назад
генерировать пароль свой, не храня его нигде, зная лишь строку и зерно, поэтому используются псевдослучайные числа. Ну и да, можно не выводить все пароли в консоль, а только один, по строке. Это я так, для теста. Вот исходный код на C, пробовал на линуксе через gcc компилировать и открывать программу, где-то 10-100 млн паролей обрабатывает менее чем за минуту.

 #include <stdio.h> 
#include <stdlib.h>

int main(){
const unsigned int UPPER_BOUND = 126;
const unsigned int LOWER_BOUND = 33;

int seed;
unsigned int char_count;
unsigned int password_count;
// for (int i = 0; i !=256; i++) printf("%d. %c\n", i, (char)i); 33-126
printf("Enter a random number (seed) that will be used to generate a password:\n");
scanf("%d", &seed);
srand(seed);

printf("How many characters will your password be:\n");
scanf("%d", &char_count);

printf("How many passwords you need:\n");
scanf("%d", &password_count);

for(int i = 0; i < password_count; i++) {
for(int j = 0; j < char_count; j++) printf("%c", (char)rand() % (UPPER_BOUND - LOWER_BOUND + 1) + LOWER_BOUND);
printf("\n");
}

getchar();

return 0;
}
Дополнен 3 часа назад
#include <stdio.h>
#include <stdlib.h>

int main(){
const unsigned int UPPER_BOUND = 126;
const unsigned int LOWER_BOUND = 33;

int seed;
unsigned int char_count;
unsigned int password_count;
// for (int i = 0; i !=256; i++) printf("%d. %c\n", i, (char)i); 33-126
printf("Enter a random number (seed) that will be used to generate a password:\n");
scanf("%d", &seed);
srand(seed);

printf("How many characters will your password be:\n");
scanf("%d", &char_count);

printf("How many passwords you need:\n");
scanf("%d", &password_count);

for(int i = 0; i < password_count; i++) {
for(int j = 0; j < char_count; j++) printf("%c", (char)rand() % (UPPER_BOUND - LOWER_BOUND + 1) + LOWER_BOUND);
printf("\n");
}

getchar();

return 0;
}
Дополнен 3 часа назад
хотел вставить через блок кода, но сайт баганулся, дополнением оформил
Дополнен 3 часа назад
Можно также хранить списки паролей. Например, текстовый файл в таком виде:

Discord

Google

Mail

И сделать фиксированный шаг, запомнив его. Например, у нас зерно "эталонное", то есть для 1. Discord это 15185129, а строка 1961723. Делаем +10 к зерну и -5 к строке, получаем 2. Google. Либо можно дописывать: 2. Google +54/-21; 3. Mail -351/-851 в самом файле;
Дополнен 3 часа назад
А сам файл хранить в облаке где-то. Ну или в запороленном архиве 7zip с шифрованием AES-256, если вы прям параноик, в хорошо защищенном облаке.
Дополнен 2 часа назад
Ну и вывод по строке:

#include <stdio.h>
#include <stdlib.h>

int main(){
const unsigned int UPPER_BOUND = 126;
const unsigned int LOWER_BOUND = 33;

int seed;
unsigned int char_count;
unsigned int password_count;
// for (int i = 0; i !=256; i++) printf("%d. %c\n", i, (char)i); 33-126
printf("Enter a random number (seed) that will be used to generate a password: ");
scanf("%d", &seed);
srand(seed);

printf("Count of characters: ");
scanf("%d", &char_count);

printf("Password number: ");
scanf("%d", &password_count);

for(int i = 0; i < password_count; i++) {
for(int j = 0; j < char_count; j++) rand() % (UPPER_BOUND - LOWER_BOUND + 1) + LOWER_BOUND;
}

for (int i = 0; i < char_count; i++) printf("%c", (char)rand() % (UPPER_BOUND - LOWER_BOUND + 1) + LOWER_BOUND);
printf("\n");

getchar();

return 0;
}

8 ответов
SlomiX Мудрец (10674) 3 часа назад
Преимущества вашего подхода:
Безопасность:

Пароль не хранится нигде, а генерируется на лету на основе строки и зерна (seed). Это снижает риск утечки пароля.

Если строка и зерно достаточно сложные, то подобрать пароль будет крайне сложно.

Удобство:

Пользователю нужно запомнить только строку и зерно, а не сам пароль.

Можно генерировать пароли для разных сервисов, используя разные строки или зерно.

Производительность:

Ваш код обрабатывает 10-100 млн паролей за минуту, что говорит о его эффективности.

Возможные улучшения:
Криптографическая стойкость:

Используемый вами PRNG (например, rand() в C) может быть недостаточно криптографически стойким. Для генерации паролей лучше использовать криптографически безопасные генераторы, такие как:

arc4random() (в Linux/macOS).

CryptGenRandom (в Windows).

Библиотеки вроде OpenSSL (RAND_bytes).

Сложность пароля:

Убедитесь, что пароль содержит достаточно символов (минимум 12-16) и включает буквы (верхний и нижний регистр), цифры и специальные символы.

Можно добавить параметры для настройки длины и сложности пароля.

Защита от перебора:

Если злоумышленник узнает строку и зерно, он сможет сгенерировать пароль. Чтобы усложнить задачу, можно:

Добавить "соль" (salt) — дополнительную строку, которая усложнит подбор.

Использовать хеширование (например, SHA-256) для преобразования строки и зерна перед генерацией пароля.

Удобство использования:

Добавьте возможность генерации пароля по индексу (например, "строка + зерно + номер пароля").

Реализуйте поддержку разных кодировок (например, UTF-8 для паролей с не-ASCII символами).

Тестирование:

Проверьте, что пароли действительно случайны и не содержат закономерностей.

Используйте инструменты для анализа энтропии паролей.

Пример улучшенного кода:
Вот пример на C с использованием криптографически безопасного генератора (arc4random()):
 #include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <openssl/rand.h>

// Функция для генерации пароля
void generate_password(const char *input, unsigned int seed, int length, char *output) {
srand(seed); // Инициализация зерна
for (int i = 0; i < length; i++) {
unsigned char random_byte;
RAND_bytes(&random_byte, 1); // Криптографически безопасный случайный байт
output[i] = 33 + (random_byte % 94); // Диапазон печатных ASCII символов
}
output[length] = '\0'; // Завершаем строку
}

int main() {
const char *input = "my_secret_string";
unsigned int seed = 123456789; // Зерно
int password_length = 16; // Длина пароля
char password[password_length + 1];

// Генерация пароля
generate_password(input, seed, password_length, password);

// Вывод пароля
printf("Generated password: %s\n", password);

return 0;
}
больше не чат гпт ???? Мыслитель (8491) 3 часа назад
 #include <stdio.h> 
#include <stdlib.h>
#include <string.h>
unsigned long djb2(unsigned char *str) {
unsigned long hash = 5381;
int c;
while (c = *str++) hash = ((hash << 5) + hash) + c;
return hash; }
int main() {
char str[100];
unsigned int seed;
printf("Строка, зерно: ");
scanf("%99s %u", str, &seed);
srand(djb2((unsigned char *)str) + seed);
for (int i = 0; i < 12; i++) putchar((rand() % 94) + 33);
puts(""); }
kaiu Высший разум (119380) 3 часа назад
Пока никто не знал твой алгоритм, то идея норм. Я тоже генерирую пароли по определенному слову и использую свой алгоритм без всяких случайных чисел, но стойкости для меня хватает. Программу нигде не выкладывал, так что где-то это надежно.
Борисик ПчелинцевУченик (93) 2 часа назад
Ну вряд ли многие узнают о ней. Я могу легко за секунду находить хоть 10 млн паролей. Сидов 2 в 32 степени должно быть, так что не зная сид нереально перебрать. Плюс надо знать количество символов в пароле, чтоб смещения не было.
Борисик ПчелинцевУченик (93) 2 часа назад
Вот еще генератор для андроид делал, тоже хочу через сид
kaiu Высший разум (119380) Борисик Пчелинцев, просто генерировать пароли делал эту https://kaiu.narod.ru/GenPass/GenPass.html l уж кому надо было, не помню уже. А для себя у меня так стоит в проге...что не для всех
Ламзин Андрей Просветленный (37491) 2 часа назад
Кажется верхнеуровнево не отличается от хранения паролей в зашифрованном архиве.

Подобрать пароль к зашифрованному архиву == Подобрать зерно и строку для вашей программы
Борисик ПчелинцевУченик (93) 2 часа назад
почему же? Зерно и строка хранятся в голове. То есть это какие-то цифры, которые вы точно не забудете, они есть у каждого. Я некоторые последовательности годами использовал в паролях. А в файле будет только "шаг" храниться либо также в голове фиксированный шаг, а файл будет только номер сервиса содержать, никто даже не поймет, как этим пользоваться.
Борисик ПчелинцевУченик (93) 2 часа назад
смысл в том, что можно сгенерировать пароль где угодно хоть через онлайн-компилятор, если у вас нет доступа к архиву, зная лишь зерно и строку.
Борисик ПчелинцевУченик (93) 2 часа назад
зерно и строку запомнить проще, как и фиксированный шаг. и т.о. вы будете знать хоть сколько паролей хоть какой сложности, даже не храня их нигде. в архиве самих паролей не будет, будут лишь номера сайтов.
Андрей Панарин Искусственный Интеллект (257721) 2 часа назад
Хорошо, когда трудность подбора сочетается с легкостью запоминания и ввода.
Тогда не придется хранить пароль в явном виде, а можно оставить подсказку, по которой вспомнить и воссоздать пароль сможет только знающий его.
Георгий Гагарин Новичок (0) 2 часа назад
В целом, я не видю серьезных проблем в этом генераторе паролей на основе псевдослучайных чисел. Код понятен, читабелен и достаточно эффективен. Использование псевдослучайных чисел для генерации паролей является вполне подходящим решением, поскольку оно позволяет получить высокую степень случайности и избежать ненужной компьютерной мощности.

Некоторые положительные аспекты:

1. **Понятный ичитабельный код**: Код организован логически, а комментарии отсутствуют, но функциональность каждого блока кода очевидна даже для неопытного программиста.

2. **Эффективность**: Использование псевдослучайных чисел для генерации паролей является эффективным решением, поскольку оно позволяет получить высокую степень случайности без значительного увеличения вычислительной мощности.

3. **Мобильность**: Использование случайных чисел позволяет генерировать пароли, зависящие от исходной строки и зерна, что делает их приватными и подлежащими только одному владельцу.

Однако также есть некоторые потенциальные проблемы и улучшения:

1. **Сecurity**: Используемая функция `rand()` для генерации случайных чисел является не самым безопасным выбором. В C11 функцию `rand()` можно заменить функцией `random()` из `stdlib.h`, которая более безопасна и поддерживает различные семейства случайных чисел.

2. **Вероятность**: Используемая функция `rand()` может создавать повторяющиеся значения, особенно при генерации больших объемов случайных чисел. Для решения этой проблемы можно использовать более сложные алгоритмы генерации случайных чисел, такие как алгоритм Модифицированный Линейный Конгруэнтный Генератор (Modified Linear Congruential Generator).

3. **Скорость генерации**: Если вы планируете генерировать большие объемы случайных чисел, вы можете рассмотреть использование более быстрого алгоритма генерации или параллельного генерации случайных чисел.

Кроме того, у вас есть два варианта генерации паролей:

1. **Вывод всех паролей**: В первом варианте вы генерируете и выводите все пароли, а не только один.
2. **Вывод одного пароля**: Во втором варианте вы генерируете только один пароль и выводите его в консоль.

В целом, этот генератор паролей является достаточно эффективным и понятным решением проблем безопасности.
альфасамец Мастер (2115) 2 часа назад
Борисик Пчелинцев, открыт 37 минут назад
Вопрос-лидер
Что думаете об этом генераторе паролей на основе псевдослучайных чисел? Щас объясню свою идею. Смысл в том, что можно
генерировать пароль свой, не храня его нигде, зная лишь строку и зерно, поэтому используются псевдослучайные числа. Ну и да, можно не выводить все пароли в консоль, а только один, по строке. Это я так, для теста. Вот исходный код на C, пробовал на линуксе через gcc компилировать и открывать программу, где-то 10-100 млн паролей обрабатывает менее чем за минуту.


Дополнен 34 минуты назад
#include <stdio.h>
#include <stdlib.h>

int main(){
const unsigned int UPPER_BOUND = 126;
const unsigned int LOWER_BOUND = 33;

int seed;
unsigned int char_count;
unsigned int password_count;
// for (int i = 0; i !=256; i++) printf("%d. %c\n", i, (char)i); 33-126
printf("Enter a random number (seed) that will be used to generate a password:\n");
scanf("%d", &seed);
srand(seed);

printf("How many characters will your password be:\n");
scanf("%d", &char_count);

printf("How many passwords you need:\n");
scanf("%d", &password_count);

for(int i = 0; i < password_count; i++) {
for(int j = 0; j < char_count; j++) printf("%c", (char)rand() % (UPPER_BOUND - LOWER_BOUND + 1) + LOWER_BOUND);
printf("\n");
}

getchar();

return 0;
}

Дополнен 34 минуты назад
хотел вставить через блок кода, но сайт баганулся, дополнением оформил

Дополнен 28 минут назад
Можно также хранить списки паролей. Например, текстовый файл в таком виде:

Discord

Google

Mail

И сделать фиксированный шаг, запомнив его. Например, у нас зерно "эталонное", то есть для 1. Discord это 15185129, а строка 1961723. Делаем +10 к зерну и -5 к строке, получаем 2. Google. Либо можно дописывать: 2. Google +54/-21; 3. Mail -351/-851 в самом файле;

Дополнен 27 минут назад
А сам файл хранить в облаке где-то. Ну или в запороленном архиве 7zip с шифрованием AES-256, если вы прям параноик, в хорошо защищенном облаке.

Дополнен 18 минут назад
Ну и вывод по строке:

#include <stdio.h>
#include <stdlib.h>

int main(){
const unsigned int UPPER_BOUND = 126;
const unsigned int LOWER_BOUND = 33;

int seed;
unsigned int char_count;
unsigned int password_count;
// for (int i = 0; i !=256; i++) printf("%d. %c\n", i, (char)i); 33-126
printf("Enter a random number (seed) that will be used to generate a password: ");
scanf("%d", &seed);
srand(seed);

printf("Count of characters: ");
scanf("%d", &char_count);

printf("Password number: ");
scanf("%d", &passwor
Похожие вопросы