Gå til innhold

Forbedring til kode, "passordgenerator" (password sikkerhet)..


Anbefalte innlegg

Noen som vet en måte å forbedre skriptet under? Synes det var usansynlig tregt å finne koden, det blir litt som bruteforce, men jeg leker meg bare :) - Det tar mellom noen sekunder til 10-talls minutter å finne en firsifra kode..

 

Denne er sinnsykt treg, sammelignet med en ligende jeg laget i php.. :s

 

import string
import time
from random import choice

pw = ""
cnt = "1"

first_time = time.time()
last_time = first_time

while cnt == "1":
size = 4
pw = ''.join([choice(string.letters + string.digits) for i in range(size)])
print pw

if pw == "3ee6":
	print "hacked! key is", pw
	new_time = time.time()
	print "time used in sec:", (new_time - last_time)
	cnt = "2"

 

Føler meg ganske ny i python, så jeg klarer nok ikke kode noe avanserte greier. Men ser for meg at dette blir veldig avansert om den skal bli god..?

Endret av tROOP4H
Lenke til kommentar
Videoannonse
Annonse

Laget et tilsvarende script i php (dette språket kan jeg..).. Gikk frem på en litt annen måte, hadde et md5-password (langden var 6-sifret. a-z0-9), som jeg skulle brute-force, det tok knapt 6 minutter på min maskin. På en kjerne (ellers må en få til et multithread system)

Nå forsøker jeg å løse et syvsifret passord, regner med at det tar ca 5 timer. Da det er 32 millarder kombinasjoner. (a-z0-9) Ikke store bokstaver nå, da hadde tallet vært 100 ganger så mye større, og dermed tatt ~en måned..

 

Var ikke like lett i python :p

Endret av tROOP4H
Lenke til kommentar

koden din gjetter det samme passordet flere ganger, da den lager tilfeldige koder hele tiden. Du burde gå systematisk slik at hver kode blir kun gjettet en gang.

Du skriver og ut hvert enkelt passord på skjermen, noe som også stjeler veldig mye tid. Å skrive ting på skjermen er en relativt tung oppgave.

 

Legger og merke til at du bruker string.letters og ikke string.ascii_letters, du har altså med masse spesial-tegn? Dette er intentional?

 

Med å bruke alle tegnene du tillater har du 332.150.625 mulige løsninger, mens med kun ascii_letters reduserer du problemet til 14.776.336, altså har du kun 1/20 så stort problem som vanlig.

 

Lager meg en eksempel kode

import time as t, string as s

def bruteforce(secret, letters):
   start_time = t.time()

   guess_list = [0]
   guess = letters[0]

   while secret != guess:
       # Generate a new password
       pos = 0
       generating = True
       while generating:
           if pos == len(guess_list):
               guess_list += [0]
               generating = False
           else:
               guess_list[pos] += 1
               if guess_list[pos] == len(letters):
                   guess_list[pos] = 0
                   pos += 1
               else:
                   generating = False

       # Make the password from a list to a string
       guess = "".join([letters[x] for x in guess_list])
   print "Used %f seconds" % (t.time() - start_time)

if __name__ == '__main__':
   print "With ascii+digits:", 
   bruteforce("09ef", s.ascii_letters + s.digits)
   print "With all letters:",
   bruteforce("09ef", s.letters + s.digits)

Output:

With ascii+digits: Used 1.362000 seconds
With all letters: Used 73.262000 seconds

Husk:

>>> import string as s
>>> print s.letters
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzƒŠŒŽšœžŸªµºÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
>>> print s.ascii_letters
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

 

Om jeg reduserer til å kun bruke lower-case bokstaver + tall, så ender jeg opp med å løse problemet på 0.3 sekunder i python, og 5 tegn på cirka 12.3 sekunder.

Endret av etse
  • Liker 1
Lenke til kommentar

Det var ikke planen å bruke alle tegnene, nei.

Men, klarer ikke forstå hvordan du går frem for å ikke gjenta samme passordet..?

 

Uansett, mange takk for et supert script! Funker jo rimelig bra, får bare forsøke å skjønne noe som helst av det du har gjort der.. Skjønner nok etter litt lesing :)

og 5 tegn på cirka 12.3 sekunder.
- Brukte bare 9 sekunder til meg, på en liten 3.6GHz AM3-cpu:)

 

Skulle bare fått til å multithreade i python, så hadde det vært ekstra gøy for dem som har 2-4-6 eller 8 kjerner. - Vet det er mulig, og jeg skal se nermere på alt senere..:)

Endret av tROOP4H
Lenke til kommentar

Skulle bare fått til å multithreade i python, så hadde det vært ekstra gøy for dem som har 2-4-6 eller 8 kjerner. - Vet det er mulig, og jeg skal se nermere på alt senere..:)

 

http://docs.python.org/library/multiprocessing.html

 

Forresten, så er ascii_letters og letters samme string her, python 2.7.2 på ubuntu..

 

Og så har man pypy:

terra@terra-MS-7238:~/projects/pypy$ python test-brute.py

With ascii+digits: Used 20.906091 seconds to find '09efa'

 

terra@terra-MS-7238:~/projects/pypy$ ./pypy-1.6/bin/pypy test-brute.py

With ascii+digits: Used 8.076241 seconds to find '09efa'

Lenke til kommentar

du plukker et tilfeldig passord som du generer tilfeldig. Og da er det veldig sansynlig at over tid vil du teste samme passord veldig mange ganger. Forskjellen jeg gjør er at jeg går veldig systematisk:

 

Begynner med AAAA, tester så AAAB, AAAC, AAAD osv.

 

Da skjønner jeg! Klarte bare ikke se det :) Laget en ligende variant i php da.

$hash = md5("aaaaa");
$length = 5;
define('HASH', $hash);

$charset = 'abcdefghijklmnopqrstuvwxyz';
$charset .= '0123456789';
//$charset .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
//$charset .= '~`!@#$%^&*()-_\/\'";:,.+=<>? ';

//----->-----------------------------------<-----//

$charset_length = strlen($charset);
$startTime = microtime(true); 

function check($password)
{  
   if (hash('md5', $password) == HASH) {
	global $startTime;
	$endTime = microtime(true);
       echo '<br />Match found: '.$password."\r\n";
	echo "<br />Time used:";
	echo $endTime-$startTime;
       exit;
   }
}


function run($width, $position, $base_string) {

   global $charset, $charset_length;

   for ($i = 0; $i < $charset_length; ++$i) {
       if ($position  < $width - 1) {
           run($width, $position + 1, $base_string . $charset[$i]);
       }
       check($base_string . $charset[$i]);
   }
}

echo 'Target: '.HASH."\r\n";
run($length, 0, '');

echo "No match found!";

 

Her bruker jeg en md5-nøkkel som "utgangspunkt" (bare for å teste).

 

Skal teste ut pypy, i ditt tilfelle så er den over 100% raskere, noe som er sinnsykt!

Endret av tROOP4H
Lenke til kommentar

Forresten, så er ascii_letters og letters samme string her, python 2.7.2 på ubuntu..

Dette kan godt være, men vil anbefale å bruke ascii_letters over _letters i slike oppgaver

string.letters

The concatenation of the strings lowercase and uppercase described below. The specific value is locale-dependent, and will be updated when locale.setlocale() is called.

 

string.ascii_letters

The concatenation of the ascii_lowercase and ascii_uppercase constants described below. This value is not locale-dependent.

Lenke til kommentar

Kjørte bare en par tester med koden til etse.

bruteforce("09efa", s.letters + s.digits)
#Used 12.666000 seconds normal
#Used 5.646000 seconds psyco
#Used 4.8 seconds pypy
#Used 2.2 seconds pypy guess optimize

Psyco som er litt eldere(python 2.6 max)

guess forandringen ser sånn ut,liker join med list comprehension bedere.

#guess = "".join([letters[x] for x in guess_list])
guess = ''
for x in guess_list:
   guess += letters[x]

Pycuda kan være noe og se på for store farts økninger.

Endret av SNIPPSAT
  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...