JonixLUG Forum
Programmazione => C++ => Topic started by: NebulasIT on November 20, 2016, 02:59:05 PM
-
GENERATORE DI PASSWORD
Un semplicissimo Tool che ho programmato che ha la funzione di generare delle password "sicure" per le nostre registrazioni,poi vi parlerò meglio in un'altro topic come tenere delle informazioni a prova di sicurezza intesa come anonimizzazione e criptazione/decriptazione.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
static const char alphanum[] =
"0123456789"
"!@#&$%^?*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
int size= sizeof(alphanum)-1;
int main(){
system("clear");
int lunghezza=0;
cout<<"PASSWORD GENERATOR\n\n";
cout<<"Inserire la lunghezza: ";
cin>>lunghezza;
cout<<"Password: "<<endl;
srand(time(0));
for (int i=0; i<lunghezza; i++){
cout<< alphanum[rand() % size];
}
cout<<"\n\n\n";
return 0;
}
Github:https://github.com/NebulasProgrammer/KeysGenerator.cxx (https://github.com/NebulasProgrammer/KeysGenerator.cxx)
Ho intenzione di migliorarlo salvando la password in un file e altre migliorie, dove la fantasia mi porti... :)
-
(http://img.freeforumzone.it/Smiles/5/01.gif)
-
Bene, è da apprezzare lo spirito di inventiva, soprattutto se semplifica le cose e serve a far pratica.
Una mia considerazione (non vuole essere una critica)
Usare la libreria rand() per generare una password non è il metodo migliore perché produce risultati pseudo-casuali.
Si è vero, può essere più sicuro della fantasia umana, ma dal punto di vista matematico, non sarebbe impossibile reversare l'algoritmo.
In pratica, se leggi http://www.cplusplus.com/reference/cstdlib/rand/ (http://www.cplusplus.com/reference/cstdlib/rand/) , restituisce un intero tra 0 e RAND_MAX (32767)
qui spiega la logica https://en.wikipedia.org/wiki/Random_password_generator#C (https://en.wikipedia.org/wiki/Random_password_generator#C)
Persino µzozz raccomanda l'uso della criptazione con rand_s() :P
Altro accorgimento, salvare una password in un file in chiaro, non è una grande idea.
-
Accetto volentieri le vostre critiche in quanto sono molto produttive, quindi ti ringrazio moltissimo della tua critica ne farò tesoro! ;D
Il fatto della password nel file, dato che le password potrebbero essere molto lunghe vorrei creare un file criptato etc.. ho idee in testa un po' confusionarie, una volta messo a posto quelle posso fare un generatore di password che genera un file criptato che puoi importare su un programma che si chiama generalmente "password e chiavi", non so se questo sia il nome, insomma è un insieme di funzioni PGP/GPG
-
Al limite puoi fare 1 XOR del random con il tempo reale ;)
Così ti diventa - matematicamente reversibile sebbene la cosa sia già informaticamente implausibile (http://www.vocinelweb.it/hdonline/uploads/pc_cazzotto.gif)
-
Io lo farei in una maniera abbastanza diversa e sfrutterei molto di più il C++ (usando una piccola parte di quello che offre) xD. Scusa la critica, (non me ne volere) ma un programma fatto in questo modo mi sembra più un programma C "con cin e cout" che un programma in C++. Innanzitutto terrei in considerazione fattori non poco trascurabili: l'entropia e la distribuzione (di simboli, caratteri e numeri). Se sei interessato ti propongo del materiale che ti può aiutare a capire qualcosa di più:
- A Mathematical Theory of Communication (http://www.mast.queensu.ca/~math474/shannon1948.pdf)
- Discrete probability distribution (https://en.wikipedia.org/wiki/Probability_distribution#Discrete_probability_distribution)
Scarterei quindi rand() e srand() basati su <ctime>. Detto questo userei la librerie standard
<random>
Per la generazione della password mi servirei della classestd::random_device
Una classe che mi permette di generare numeri casuali uniformemente distribuiti secondo Algoritmi non determistici (https://en.wikipedia.org/wiki/Nondeterministic_algorithm). Una volta generato questo numero lo darei in pasto alla classe: std::mt19937
Questa classe si basa sul Mersenne Twister Engine, un engine per la generazione di numeri pseudo-casuali basato sul Mersenne Twister (https://en.wikipedia.org/wiki/Mersenne_Twister). Il suo nome deriva dal fatto che fa utilizzo dei numeri primi detti: Mersenne prime (https://en.wikipedia.org/wiki/Mersenne_prime). Una volta fatto questo stabilirei un campo di distribuzione usando: std::uniform_int_distribution
Questa mi genera dei numeri secondo una distribuzione discreta uniforme in un determinato intervallo. Esempio:
std::uniform_int_distribution<int> dNum(0, 9); //Distanza dei numeri (10-1)
std::uniform_int_distribution<int> dLet(0, 25); //Distanza delle lettere (sono 26 lettere quindi partendo da 0 la distanza è 26-1)
std::uniform_int_distribution<int> dSim(0, 13); //Distanza tra i simboli, considerandone 14 (14-1)
char letMin[26] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
char letMai[26] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
char simboli[14] = { '!', '#', '@', '~', '$', '^', '.', ',', '-', '+', '%', '?', '*', '=' };
Questo è solo un esempio di come si potrebbe usare meglio il C++ per creare un programma del genere. Ovviamente non devi basarti per forza su quello che ho scritto io, il mio era solo un esempio. Ho fatto un programma del genere come esercizio, se non vuoi spoiler te lo carico su Git così puoi vederlo :D
-
Per me va bene! Come detto sopra accetto sempre i consigli, in quanto ho molto da imparare (e ne ho voglia), quindi se lo posti su Github, mi studio il codice ;D
-
Per me va bene! Come detto sopra accetto sempre i consigli, in quanto ho molto da imparare (e ne ho voglia), quindi se lo posti su Github, mi studio il codice ;D
Va bene xD Appena posso te lo posto, non lo faccio subito perchè l'ho sul PC a Taranto, il tempo che me lo faccio mandare e lo carico. Magari lo commento un po' in modo da far capire meglio la logica che ho seguito anche se era molto semplice ;D
-
Va bene grazie ;)
-
Comunque non me ne sono scordato eh, ultimamente sono molto impegnato causa esami e quindi non ho il tempo di revisionarlo e commentarlo. Appena riesco te lo posto. Nel frattempo tu hai fatto qualcosa?
-
Si, mi sono dedicato al python e rust ahaha ;D
-
Si, mi sono dedicato al python e rust ahaha ;D
Capito, pensavo avessi lavorato a questo xD
-
potresti utilizzare la rand unita ad una specie di salt come fa wordpress per generare le password, sono md5 + salt, infatti in un altro post feci vedere un sito dove digiti una password, te la cripta per wordpress, poi se la ricripti ancora esce fuori un hash diverso. così eviti la pseudocasualità del salt, se no vai di gpg ed entropia e vai a colpo sicuro!!! :D