Crearea Automata a Unor Parole Pseudo Aleatoare

download Crearea Automata a Unor Parole Pseudo Aleatoare

of 8

Transcript of Crearea Automata a Unor Parole Pseudo Aleatoare

Academia de studii economice BucurestiFacultatea de Cibernetica, Statistica si Informatica Economica

Proiect la Sisteme de operareCrearea automata a parolelor pseudo-aleatoare-Shell Script

Nume: Stan Alexandru Daniel Asist. Univ. Dr. Radu Constantinescu

Crearea automat a unor parole pseudo-aleatoare. Ce nseamn o parol? Parola reprezint un ir de caractere (litere, cifre, semne, spaii) prin intermediul cruia, o persoan (sauorganizaie) i certific identitatea i dreptul de a accesa anumite resurse. Securitate?Cei mai muli din utilizatori nu stiu s i creeze o parol care s fie sigura. Cei mai muli dintre ei folosesc cteva parole pe care le schimb la diferite intervale de timp, parole formate din ziua lor de natere, adresa, departamentul n care lucreaz, astfel fcndu-le uor de memorat dar i uor de aflat.Studiile arat c cele mai folosite parole sunt 12345, 123456, admin (cu variantele admin123 sau admin1), qwerty, password, test n acest referat voi ncerca s realizez un shell script care s creeze automat nite parole pseudo aleatoare n funcie de cerinele utilizatorului. Crearea acestor parole pseudo-aleatoare se bazeaz pe generarea numerelor pseudoaleatoare.Ceea ce st la baza crerii acestor parole este ID (PID) procesului curent. Utlizarea PID este o variant bun ,deoarece PID-urile sunt create de sistem ntr-o anumit ordine. Ideea principal a scriptului o reprezint utilizarea unui fiier numit keyboard care conine, n funcie de preferinele utilizatorului, fie toate caracterele de pe tastatur (cte una pe fiecare rnd), fie acesta i poate crea o proprie list de caractere din care se vor alege aleator pentru generarea parolei. Dup crearea fiierului keyboard, elementele din acest fisier sunt ncrcate separate unul cte unul ntr-un array (vom ti astfel cte caractere avem).Astfel vom genera automat numere ntre 1 i numrul de caractere din array. Pasul final este reprezentat de afiarea parolei pe ecran.De asemenea am adugat dou opiuni: -m prin care sunt preluate automat n fiierul keyboard toate caracterele de pe tastatur; -n prin care parolele generate sunt salvate ntr-un fiier text. De asemenea, putem da lungimea parolei (pe care o dorim ),ca argument. Vom explica cum am realizat acest script pe pai: PASUL 1: este reprezentat de declararea variabilelor LUNGIME (n care este reinut lungimea parolei ). Aceast variabil, LUNGIME, va avea valoarea iniial 8. De asemenea, vom declara KEYBOARD_FILE care reine locul de pe disk unde se afl salvat fiierul Keyboard(care conine caracterele din care se va genera automat parola), ARGUM care va reine iniial valoarea 0,precum i RANDOM care va fi iniializat cu PID-ul procesului. PASUL 2: l reprezint funcia ALEATOR_NU. Pentru a nelege cum funcioneaz aceast funcie, vom presupune c dorim s crem numere aleatoare ntre 1 i 40.Vom folosi opratorul aritmetic modulo(%) pentru a reduce toate numerele . Astfel dup folosirea operatorului modulo numerele pot lua valoarea ntre 0 i 39. Pentru aflarea NUMAR_ALEATOR vom avea nevoie de LIMITA_SUP care reprezint numrul de caractere din care se va forma parola.Funcia care ne permitem sa aflam resturile este: NUMAR_ALEATOR=$(($RANDOM % $LIMITA_SUP + 1)).Folosind aceast ecuaie se va produce un numr aleator ntre 1 i LIMITA_SUP.

PASUL 3:este reprezentat de funcia INCARCA i funcia VERIFICA Funcia VERIFICA are rolul de a verifica dac dimensiunea fiierului KEYBOARD_FILE este diferit de 0. Dac aceast dimensiune nu este diferit de 0 ,utilizatorul va fi ntrebat dac dorete s i creeze propriul fiier KEYBOARD_FILE. Dac rspunsul acestuia este afirmativ, acesta va specifica numrul de caractere care vor fi adugate cte unul pe linie. Dac raspunsul acestuia este negative, atunci se va executa instruciunea INCARCA. Funcia INCARCA are rolul de a ncrca caracterele din care se va genera parola. Utilizatorul va fi ntrebat dac dorete ncrcarea tuturor caracterelor de pe tastatur.Aceasta se realizeaz cu ajutorul unei instruciuni forinIdeea acesteia este aceea de a parcurge fiecare caracter de pe tastatur i de a il adauga n fiierul KEYBOARD_FILE. Rezultatul l reprezint un fiier care conine toate caracterele, cte unul pe fiecare linie (astfel ne este mai uor de ncrcat n array-ul KEYS).Unele caractere au la nceput cte un backslash care semnific utilizarea acestora ca i caractere normale i nu speciale. PASUL 4: Deoarece avem argumente n line de comand ,trebuie s testm valabilitatea fiecarei linii de comand.Primul pas este acela de a testa dac numrul argumentelor este acela pe care l ateptm. Pentru acest shell script ne asteptm s nu avem mai mult de trei argumente. Pentru a testa acest lucru vom folosi echo $# care ntoarce numarul argumentelor. Dup testarea numrului de argumente, dorim s vedem dac argumentele sunt valide . Acest lucru l putem verifica mai ntai cu instruciunea for in $@ (care are rolul de lua pe rnd valoarea fiecarui argument), apoi cu instruciunea case. Astfel vom tii dac argumentele sunt cele declarate, adica m,n, si LUNGIME. Vom analiza n continuare argumentele cu ajutorul lui getopts.Aceasta verific prima data dac exist o liniut (-) n linia de comand. Verific apoi dac litera ce urmeaz este una dintre opiunile valide. Dac optiunea este valid, atunci ea este memorat n variabila ARGUMENT. n acest moment este returnat un exit status zero, deci corpul ciclului while este executat. Cu ajutorul instruciunii case(care se afla in interiorul instruciunii while) vom verifica dac valorile luate de variabila ARGUMENT se afl printre: -m(prin care sunt preluate automat n fiierul keyboard toate caracterele de pe tastatur) -n (prin care parolele generate sunt salvate ntr-un fiier text). -/? (orice alt argument n afar de m, n va afia funcia MENIU) Acum c am terminat cu declararea variabilelor vom ncepe programul propriu zis. PASUL 5:Vom utilize funcia VERIFICA pentru a ncrca fiierul KEYBOARD_FILE; Dup ce avem fiierul KEYBOARD_FILE suntem gata s ncarcam array-ul KEYS cu datele din fiier.Cea mai simpl cale este cu ajutorul instruciunii while pentru a citi fiecare linie din fiier i de a o adauga in variabila ARRAY_ELEMENT. Pentru a se citi fiecare caracter n ordine naine de instruciunea while se va iniializa o variabil X cu 0. Aceasta va creste cu 1 la fiecare caracter gasit n fiierul KEYBOARD_FILE. La sfritul buclei while vom avea i LIMITA_SUP necesar pentru calcularea NUMAR_ALEATOR care este egal cu valoarea lui X.

PASUL 6: Se va crea o list de numere cu ajutorul lungimii parolei(LUNGIME).Astfel lista iniial creat cu ajutorul variabilei LUNGIME=8 va arta de genul urmtor 1 2 3 4 5 6 7 8. Procesul const n incrementarea cu 1 a unei variabile atata timp ct aceasta este mai mic decat lungimea parolei, i afiarea acesteia cu ajutorul lui echo urmat de un spaiu: echo x . Rezultatul l reprezint lista de caractere separate printr-un spaiu. PASUL 7: Se va construi noua parol pseudo-aleatoare. La nceput parola se va iniializa cu o valoare nula pw= . Cu ajutorul instruciunii for vom parcurge toate numerele din lista creat la pasul 6.n interiorul instruciunii for vom folosi o singur comand pentru a crea aceast parola. La fiecare iteraie vom aduga lui pw un caracter nou pe care l generm cu ajutorul funciei ALEATOR_NU n interiorul array-ului KEYS. Funcia NUMAR_ALEATOR trebuie s aiba dat o limit superioar. PW=${PW}${KEYS[$(NUMAR_ALEATOR $LIMITA_SUP)]} Dup aflarea parolei pseudo-aleatoare, aceasta va fi afiat pe ecran. Acum sa vedem cum arata programul: #!/bin/bash LUNGIME=8 KEYBOARD_FILE=/home/alexandrustan/keyboard.keys ARGUMENT_N=0 RAMDOM=$$ function ALEATOR_NU { NUMAR_ALEATOR=$(($RANDOM % $LIMITA_SUP +1)) echo "$NUMAR_ALEATOR" } function INCARCA { echo "Doriti sa incarcati automat toate caracterele de pe tastatura? (da/nu)" read raspuns case $raspuns in da|DA) : ;; *)echo "Nu se poate generala parola fara caractere!" VERIFICA;; esac cat /dev/null >$KEYBOARD_FILE for CHAR in \` 1 2 3 4 5 6 7 8 9 0 \- \= \\ q w e r t y u i o \ p \[ \] a s d f g h j k l \; \ z x c v b n m \, \ \. \/ \\ \~ \! \@ \# \$ \% \^ \& \* \( \) _ \+ \| \ Q W E R T Y U I O P \{ \} A S D F G H J K L \: \ \ Z X C V B N M \< \> \? \| \. 0 1 2 3 4 5 6 7 8 9 \/ \ \* \- \+ do echo "$CHAR" >> $KEYBOARD_FILE done

sleep 1 } function MENIU { echo "Optiunile sunt:" echo " -m prin care sunt preluate toate caracterele de pe tastatura" echo " -n parolele generate sunt salvate intr-un fisier txt" echo " -lungimea parolei" } if (($# > 3)) then MENIU exit 1 fi if (($# != 0)) then for CMD_ARG in $@ do case $CMD_ARG in [1-9]) LUNGIME=$CMD_ARG ;; -n): ;; -N): ;; -m): ;; -M): ;; *) MENIU exit 1;; esac done fi while getopts ":n N m M" ARGUMENT 2>/dev/null do case $ARGUMENT in m|M) for CHAR in \` 1 2 3 4 5 6 7 8 9 0 \- \= \\ q w e r t y u i o \ p \[ \] a s d f g h j k l \; \ z x c v b n m \, \ \. \/ \\ \~ \! \@ \# \$ \% \^ \& \* \( \) _ \+ \| \ Q W E R T Y U I O P \{ \} A S D F G H J K L \: \ \ Z X C V B N M \< \> \? \| \. 0 1 2 3 4 5 6 7 8 9 \/ \ \* \- \+

do echo "$CHAR" >> $KEYBOARD_FILE done sleep 1 ;; n|N) ARGUMENT_N=1 ;; /?)MENIU;; esac done function VERIFICA { test -s $KEYBOARD_FILE || { echo "Trebuie sa aveti un sir de caractere! " echo "Doriti sa adaugati caractere? (da/nu)" read rsp case $rsp in da|Da) echo "Cate caractere doriti sa adaugati?" read n i=1 while ((i > $KEYBOARD_FILE ((i = i + 1)) done ;; Nu|nu) INCARCA ;; esac } } VERIFICA x=0 while read ARRAY_ELEMENT do ((x = x + 1)) KEYS[$x]=$ARRAY_ELEMENT done < $KEYBOARD_FILE

LIMITA_SUP=$x echo "$LIMITA_SUP" FOR_COUNT=$( x=0 while ((x < LUNGIME)) do ((x = x + 1)) echo "$x" done ) echo "$FOR_COUNT" pw= for o in $FOR_COUNT do pw=${pw}${KEYS[$(ALEATOR_NU $LIMITA_SUP)]} done echo "Lungimea parolei este: $LUNGIME" echo "Parola este: $pw" if ((ARGUMENT_N = 1)) then echo "${pw}" >> parole.txt fi cat /dev/null >$KEYBOARD_FILE

Bibliografie: 1. Mastering Unix Shell Scripting Randal K. Michael, Capitolul 1, pagina 36; Capitolul 10, pagina 263-295; Capitolul 21, pagina 523-543. 2. Advanced Bash Shell-pagina 96 3. www.stefamedia.ro Materiale teoretice