JonixLUG Forum

Programmazione => C++ => Topic started by: NebulasIT on November 20, 2016, 02:59:05 PM

Title: [TOOL] Keygenerator.cxx
Post 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.
Code: You are not allowed to view links. Register or Login
#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...  :)
Title: Re:[TOOL] Keygenerator.cxx
Post by: g on November 20, 2016, 03:04:40 PM
(http://img.freeforumzone.it/Smiles/5/01.gif)
Title: Re:[TOOL] Keygenerator.cxx
Post by: lynx on November 20, 2016, 06:26:41 PM
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.
Title: Re:[TOOL] Keygenerator.cxx
Post by: NebulasIT on November 20, 2016, 07:52:46 PM
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
Title: Re:[TOOL] Keygenerator.cxx
Post by: g on November 20, 2016, 09:10:51 PM
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)
Title: Re:[TOOL] Keygenerator.cxx
Post by: CrashTest on November 21, 2016, 02:10:51 PM
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
Code: You are not allowed to view links. Register or Login
<random>
Per la generazione della password mi servirei della classe
Code: You are not allowed to view links. Register or Login
std::random_deviceUna 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:
Code: You are not allowed to view links. Register or Login
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:
Code: You are not allowed to view links. Register or Login
std::uniform_int_distributionQuesta mi genera dei numeri secondo una distribuzione discreta uniforme in un determinato intervallo. Esempio:
Code: You are not allowed to view links. Register or Login
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
Title: Re:[TOOL] Keygenerator.cxx
Post by: NebulasIT on November 21, 2016, 03:20:14 PM
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
Title: Re:[TOOL] Keygenerator.cxx
Post by: CrashTest on November 21, 2016, 03:39:07 PM
You are not allowed to view links. Register or Login
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
Title: Re:[TOOL] Keygenerator.cxx
Post by: NebulasIT on November 21, 2016, 04:00:09 PM
Va bene grazie  ;)
Title: Re:[TOOL] Keygenerator.cxx
Post by: CrashTest on November 29, 2016, 11:53:02 AM
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?
Title: Re:[TOOL] Keygenerator.cxx
Post by: NebulasIT on November 29, 2016, 12:53:34 PM
Si, mi sono dedicato al python e rust ahaha  ;D
Title: Re:[TOOL] Keygenerator.cxx
Post by: CrashTest on December 01, 2016, 04:20:22 PM
You are not allowed to view links. Register or Login
Si, mi sono dedicato al python e rust ahaha  ;D
Capito, pensavo avessi lavorato a questo xD
Title: Re:[TOOL] Keygenerator.cxx
Post by: davenull on January 04, 2017, 03:31:10 AM
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