mboost-dp1

Kunsten at knække et password


Gå til bund
Gravatar #51 - arne_v
3. jan. 2008 01:57
#50

Kræver dog PHP version >= 5.1.2
Gravatar #52 - arne_v
3. jan. 2008 01:58
#48

Ja. Hvis vi kalder et 3 års visa for permanent.
Gravatar #53 - Jace
3. jan. 2008 02:02
#49:

#43

(26+26+10) ^ 10 er mange gange større end (26+26)^8

Det er vel kun ^8 så længe vi arbejder med passwords på 8 karakterer?

Så min udregning på 62^8 er vel i orden?
Gravatar #54 - Jace
3. jan. 2008 02:04
#51:
Jeg ved ikke om det er fordi jeg kører php 4, men den siger:
Fatal error: Call to undefined function: hash() on line 3
Gravatar #55 - Jace
3. jan. 2008 02:05
#52:
Ja. Hvis vi kalder et 3 års visa for permanent.

Det gør vi i min verden :)
Gravatar #56 - arne_v
3. jan. 2008 02:24
#53

Ja. Pointen var bare at det var store mængder data for en længde på 8, men går du højere op så bliver det astronomisk.
Gravatar #57 - arne_v
3. jan. 2008 02:25
#54

Yes.

Mindst 5.1.2 !
Gravatar #58 - arne_v
3. jan. 2008 02:27
#57

Men du kan godt finde en SHA-256 til ældre PHP.

Google finder bl.a. http://nanolink.ca/pub/sha256/sha256.txt
Gravatar #59 - Jace
3. jan. 2008 22:25
#56: Ja, en sådan liste ville nok være svær at have liggende hjemme hos en privatperson og det er nok også svært at få den hostet ude i byen på grund af det formål den er lavet med.

#58: Okay, super... Men var det muligt at compile din java kode til noget jeg kunne køre i en consol uden noget kendskab til java? Jeg tror umiddelbart at java i en consol vil performe lidt bedre end php...
Gravatar #60 - arne_v
3. jan. 2008 23:49
#59

Hent Java (det er gratis), compile og kør.

PS: Hvis du vil hastigheds teste skal du rette koden så den ikke udskriver alle de fundne - det tager nemlig meget længere tid end beregningen. Du kan evt. udskrive password hvis hash har en bestemt værdi.
Gravatar #61 - Jace
4. jan. 2008 00:28
#60: Hehe, jeg tror du overvurdere mine java-evner en lille smule. De er faktisk ikke eksisterende :)

Jeg kunne nok godt finde ud af at compile den, men at rette i koden er jeg simpelthen ikke sej nok til at kunne :)
Gravatar #62 - arne_v
4. jan. 2008 00:41
#61

Hvis du erstatter:


private static void printHash(String pw) {
System.out.println(pw + " -> " + toHex(md.digest(pw.getBytes())));
}


med:


private static void printHash(String pw) {
if(toHex(md.digest(pw.getBytes())).equals("bla bla bla")) {
System.out.println(pw);
System.exit(0);
}
}
Gravatar #63 - Jace
4. jan. 2008 00:59
#62: Okay, cool... Det skal da lige prøves :)

Forresten, når du snakker om at det skal optimeres, er det så sådan noget med at det skal køre threaded så det kan udnytte quad-cpu'er og sådan?

For sådan noget som det her, må da være rimelig enkelt at dele ud over flere cpu'er, så hver cpu bare får en range af de karakterer der skal køres igennem?
Gravatar #64 - arne_v
4. jan. 2008 02:13
#63

Jep - det bør nemt at multithreade denne slags beregninger.
Gravatar #65 - arne_v
4. jan. 2008 02:17
#63

Jeg optimerede lige lidt for find:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class HashFinder {
private static MessageDigest md;
private static byte[] target;
public static void main(String[] args) throws NoSuchAlgorithmException {
md = MessageDigest.getInstance("SHA-256");
// Demo : find zzzz blandt små bogstaver og tal
target = md.digest("zzzzz".getBytes());
checkAllHash("abcdefghijklmnopqrstuwvxyz0123456789");
}
public static void checkAllHash(String valid) {
int i = 1;
while(true) {
System.out.println("Checking all passwords of length " + i);
checkAllHash(valid.getBytes(), new byte[i], 0);
i++;
}
}
public static void checkAllHash(byte[] valid, byte[] buf, int ix) {
if(ix < buf.length) {
for(int i = 0; i < valid.length; i++) {
buf[ix] = valid[i];
checkAllHash(valid, buf, ix + 1);
}
} else {
checkHash(buf);
}
}
private static void checkHash(byte[] pw) {
if(Arrays.equals(md.digest(pw), target)) {
System.out.println("Found match: " + new String(pw));
System.exit(0);
}
}
}

finder "zzzzz" blandt kombinationer af små bogstaver og tal på ca. 60 sekunder.

25*36*36*36*36 / 60 = 700000 per sekund

En quad core bør kunne nå langt over 1 million så.
Gravatar #66 - themuss
4. jan. 2008 06:39
Du laver de fede ting arne!!! Først en hash-generator og nu en hashFinder. I think i love you.
Gravatar #67 - fidomuh
4. jan. 2008 08:57
#65

Naar jeg faar min server op og koere her i weekenden skal jeg gerne benchmarke lidt paa den.

Det er med 2.4Ghz Quad-Core :)

Jeg rodede lidt med det igaar, selv, men var sq for traet til at faa noget brugbar kode ude..
Gravatar #68 - Jace
4. jan. 2008 23:18
Ja, jeg er sku også klar på at benchmarke en masse her i weekenden på min Core 2 Duo :)
Gravatar #69 - Jace
5. jan. 2008 00:16
Hvor mange special tegn findes der egentlig?

[A-Z] = 26 tegn
[a-z] = 26 tegn
[0-9] = 10 tegn

Special tegn = ???
Gravatar #70 - Spiderboy
5. jan. 2008 00:37
#69
Lige så mange, som du har lyst til. Ingen har sagt, at du ikke må bruge f.eks. Unicode. :-)
Gravatar #71 - arne_v
5. jan. 2008 01:21
#69

Du kan starte beskedent med ISO-8859-1:

http://www.kostis.net/charsets/iso8859.1.htm
Gravatar #72 - arne_v
5. jan. 2008 03:15
#67 & 68

Hvis der skal udnyttes multi core så skal koden jo laves multithreaded.

Det troede jeg var nemt, men det var faktisk lidt sværere end som så - bl.a. fordi MessageDigest klassen ikke er thread safe.

Jeg endte op med følgende:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class HashFinderMT {
private int nthr;
private byte[] valid;
private boolean done;
public HashFinderMT(int nthr, String valid) {
this.nthr = nthr;
this.valid = valid.getBytes();
done = false;
}
public void findHash(byte[] target) throws NoSuchAlgorithmException {
int len = 1;
while(!done) {
System.out.println("Checking all passwords of length " + len);
findHash(target, len);
len++;
}
}
public void findHash(byte[] target, int len) throws NoSuchAlgorithmException {
Thread[] t = new FinderThread[nthr];
int[] split = new int[nthr + 1];
for(int i = 0; i <= nthr; i++) {
split[i] = valid.length * i / nthr;
}
for(int i = 0; i < nthr; i++) {
t[i] = new FinderThread(split[i], split[i + 1] - 1, this, len, target);
}
for(int i = 0; i < nthr; i++) {
t[i].start();
}
for(int i = 0; i < nthr; i++) {
try {
t[i].join();
} catch (InterruptedException e) {
}
}
}
public byte[] getValid() {
return valid;
}
public boolean getDone() {
return done;
}
public void setDone(boolean done) {
this.done = done;
}
public static void main(String[] args) throws NoSuchAlgorithmException {
// Demo : find zzzzz blandt små bogstaver og tal
HashFinderMT hfmt = new HashFinderMT(4, "abcdefghijklmnopqrstuwvxyz0123456789");
hfmt.findHash(MessageDigest.getInstance("SHA-256").digest("zzzzz".getBytes()));
}
}

class FinderThread extends Thread {
private MessageDigest md;
private int start;
private int end;
private HashFinderMT hfmt;
private byte[] buf;
byte[] target;
byte[] valid;
public FinderThread(int start, int end, HashFinderMT hfmt, int len, byte[] target) throws NoSuchAlgorithmException {
md = MessageDigest.getInstance("SHA-256");
this.start = start;
this.end = end;
this.hfmt = hfmt;
buf = new byte[len];
this.target = target;
valid = hfmt.getValid();
}
public void run() {
for(int i = start; i <= end; i++) {
buf[0] = valid[i];
checkAllHash(buf, 1);
}
}
public void checkAllHash(byte[] buf, int ix) {
if(hfmt.getDone()) return;
if(ix < buf.length) {
for(int i = 0; i < valid.length; i++) {
buf[ix] = valid[i];
checkAllHash(buf, ix + 1);
}
} else {
checkHash(buf);
}
}
public void checkHash(byte[] pw) {
if(Arrays.equals(md.digest(pw), target)) {
System.out.println("Found match: " + new String(pw));
hfmt.setDone(true);
}
}
}

men jeg ved faktisk ikke om det virker som det skal fordi jeg har ikke en multi core CPU.
Gravatar #73 - myplacedk
5. jan. 2008 09:46
#72
Virker fint, bruger næsten 200% CPU på min dualcore. :)

Konceptet i at udnytte sådan et bæst er heldigvis ret simpelt: Bare fordel belastningen i flere tråde (eller processer...), (og sørg for at de ikke venter på hinanden), så skal det nok gå.
(Men det vidste du nok godt.)

Men for dem der ikke er Java-hajer:

newz.dk laver lidt fuckup i det:
getInstance("SHA-256&quo
t;)

skal være
getInstance("SHA-256")
Gravatar #74 - Jace
5. jan. 2008 11:56
Det kan være newz.dk kan håndtere koden hvis den bliver smidt i en kode-boks...

kode
Gravatar #75 - arne_v
5. jan. 2008 15:06
#74

Desværre er kode-bokse ikke glad for lange kode sekvenser.
Gravatar #76 - BluepaiN
5. jan. 2008 19:18
Er jeg den eneste der tænker, hvorfor sådan noget ikke er krypteret med RSA? Krypter hele lortet, smid den private nøgle op på en random gmail (det bliver alligevel aldrig slettet og chancen for at de finder [email protected] er utroligt lille.) og slet den fra computerne/serveren, så den kun findes på gmailen, hvor den bliver hentet hver gang den skal bruges. Og hvis vi skal være helt sikre, så krypterer vi også den.

Self. skal niveauet være omkring 256 bits, måske endda højere, men pointen er, at TGG, eller andre (måske lige med undtagelse af NSA, meeen de har ikke så meget med sagen at gøre ;) ), ikke har computerkraften til at knække passwordet.

For de u-indviede, så benytter RSA sig af primfaktorisering, hvilket vil sige at man gange to enorme primtal sammen, hvorefter man så finder deres faktorer (de to primtal tal de er blevet ganget med). Det tager ikke ret mange sekunder, at vælge 2 primtal, men jeg siger bare stakkels gut, der skal prøve at finde de rette faktorer.
Gravatar #77 - arne_v
5. jan. 2008 19:28
#76

Ja det tror jeg at du er den eneste som undrer dig over.

Problem stillingen man vil beskytte sig mod er når både kode og database er kompromiteret.

Da RSA i modsætning til hash er en reversibel algoritme, så vil det være en sikkerhedsmæssig katastrofe.

Og for de uindviede: så er RSA 256 bit totalt usikkert. Man anbefaler 2048 bit idag. Man kan ikke sammenligne bits i en hash algoritme og bits i en private-public key algoritme.
Gravatar #78 - Jace
5. jan. 2008 21:40
Er RSA grunden til at det vil være en mindre katastrofe for computer kryptering hvis vi på et tidspunkt fik bevist matematisk hvordan primtal opstår?

I dag findes der jo ikke anden udvej end at prøve sig frem om der er andre tal end 1 og tallet selv der går op i det.

Men er det på grund af RSA eller er det noget mere generelt i computer kryptering?
Gravatar #79 - arne_v
5. jan. 2008 22:25
#78

Det matematiske problem i RSA er faktorisering.

Hvis der blev fundet en mere effektiv metode til det så ville sikkerheden i RSA blive reduceret.

Der er andre private-public key algoritmer. DSA bruger også et eller andet med prim tal. Men ELGamel bruger et eller andet med diskrete logaritmer.

Og hvis jeg lyder lidt wishy-washy med hensyn til det matematiske, så er det korrekt - matematikken bag den her slags ligger over hvad jeg forstår.
Gravatar #80 - Spiderboy
5. jan. 2008 22:35
#79
El Gamel benytter sig af kvotientgrupper fra talteorien, dvs. når man implementerer det i praksis er det heltal og modulus-operationer det handler om. :-)
Gravatar #81 - Jace
5. jan. 2008 22:49
#75: arne_v
Desværre er kode-bokse ikke glad for lange kode sekvenser.


Ja, det kan jeg se. Prøvede det lige med din kode, og det er kun de 3 første linjer der kommer ind i boksen.

Er hmn bekendt med problemet?
Gravatar #82 - arne_v
5. jan. 2008 22:51
#80

Er der nogen som læser matematik ?

:-)
Gravatar #83 - arne_v
5. jan. 2008 22:52
#81

Ved jeg ikke.

Jeg er heller ikke helt klar over om det er antal linier, antal bogstaver eller special tegn i koden der er skyld i trunkeringen.

Men der er et eller andet galt.
Gravatar #84 - Spiderboy
5. jan. 2008 22:55
#82
Hvordan kunne du dog gætte det?

(ja, sidefag)

:-)
Gravatar #85 - Jace
5. jan. 2008 23:18
Jeg har fundet en SHA-256 brute force cracker som er skrevet i VB.NET:

http://khsw.blogspot.com/2005/01/sha256-brute-forc...

Jeg ved ikke rigtig hvordan det der med at lave en hash værdi fungerer, men det må vel tage længere og længere tid jo længere text-strengen som hash-værdien skal generes ud fra bliver?

Kombinationer som den tjekker pr. sekund falder i hvert fald hele tiden (programmet viser et gennemsnit over hele forløbet).

Efter 35.000.000 prøvede kombinationer (kun tal og bogstaver) har jeg kørt med en hastighed på 52.000 kombinationer pr. sekund. Jeg vil prøve og lede lidt videre efter andre crackere og se om jeg kan finde en der er kodet mere effektivt, men det ser ud som om vi skal nedjustere hastigheden en del fra de 1.000.000 vi regnede med i starten af denne tråd :)

Er der andre gider gider prøve at se hvor mange kombinationer pr. sekund man kan presse ud af programmet?
Gravatar #86 - Jace
5. jan. 2008 23:29
#83: arne_v: Okay, jeg har lige smidt et hint om det ovre i newz.dk forummet :)

Så må vi se hvad hmn kan trylle frem...
Gravatar #87 - arne_v
5. jan. 2008 23:35
#85

Hvis du prøver den sidste Java version på en multi core CPU, så er 1 million ikke umuligt.

Ja tiden må stige lidt med længden af teksten. Men ikke ret meget sammenlignet med hvor mange flere kombinationer der kommer. Længden bør ikke være et issue i forbindelse med password. Hasher man DVD ISO'er, så betyder længden nok noget.
Gravatar #88 - Jace
5. jan. 2008 23:44
#87: Altså den sidste version du har skrevet her i tråden? Jeg vil nok sige jeg bliver imponeret hvis den er 20 gange hurtigere, men det kan være jeg undervurderer java og dine evner som kodehaj :)

Men okay, den jeg linkede til er fra januar 2005, så der er nok sket lidt med kode sprog siden dengang :)
Gravatar #89 - Jace
5. jan. 2008 23:47
Hvorfor er det egentlig at SHA-256 er med sikker end MD5?

Er det fordi SHA-256 kræver mere computerkraft at genere?

For det er jo den eneste måde man kan bryde koden på.. Så jo længere tid det tager at teste alle mulige kombinationer jo sikrere er det vel?
Gravatar #90 - Jonasee
6. jan. 2008 00:10
#85

min pc står og er igang med det progam nu, og hans kode er ikke gode, eller også kan den ikke klare 2 cpu'er da min pc kun bruger 40% cpu kræft selv om jeg har sat programmet til at skulle have maks.

har ca. 53000 forsøg
Gravatar #91 - Jace
6. jan. 2008 00:23
#90: Jeg tror ikke det er skrevet til 2 kerner. Jeg kan heller ikke få den til det på min Core 2 Duo. Men det er også lavet i januar 2005 hvor dual core ikke var særlig almindeligt blandt private.

Selv nu er det jo langt fra alle programmer der bliver lavet til at køre på 2 kerner.

Jeg har indtil nu kørt 201.000.000 kombinationer på 1 time 17 minutter hvilket giver 43.655 pr. sekund...
Gravatar #92 - arne_v
6. jan. 2008 00:27
#90

Et program (i de gængse programmerings sprog) skal skrives multithreaded for at udnytte multicore.
Gravatar #93 - arne_v
6. jan. 2008 00:39
#89

Der er lavet adskillige forsøg som viser at der kan genereres kollisioner med MD5.

http://en.wikipedia.org/wiki/MD5#Vulnerability

De 128 bit er ikke nok.

Det gør MD5 ubrugeligt til fil checksum.

Det gør ikke nødvendigvis MD5 ubrugeligt til password, fordi der er
visse retsriktioner på password.

Men ingen har lyst til at bruge MD5 længere.

SHA-1 er der tilsvarende problemer med.

SHA-256 skulle være sikker. Bit størrelsen skulle beskytte mod de såkaldte birthday attacks.
Gravatar #94 - arne_v
6. jan. 2008 02:11
Med list print:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class HashFinderMT {
private int nthr;
private byte[] valid;
private boolean done;
public HashFinderMT(int nthr, String valid) {
this.nthr = nthr;
this.valid = valid.getBytes();
done = false;
}
public void findHash(byte[] target) throws NoSuchAlgorithmException {
int len = 1;
while(!done) {
System.out.println("Checking all passwords of length " + len);
long t1 = System.currentTimeMillis();
findHash(target, len);
long t2 = System.currentTimeMillis();
if(!done) System.out.println((long)Math.pow(valid.length, len)*1000/(t2 - t1 + 1) + " checks per second");
len++;
}
}
public void findHash(byte[] target, int len) throws NoSuchAlgorithmException {
Thread[] t = new FinderThread[nthr];
int[] split = new int[nthr + 1];
for(int i = 0; i <= nthr; i++) {
split[i] = valid.length * i / nthr;
}
for(int i = 0; i < nthr; i++) {
t[i] = new FinderThread(split[i], split[i + 1] - 1, this, len, target);
}
for(int i = 0; i < nthr; i++) {
t[i].start();
}
for(int i = 0; i < nthr; i++) {
try {
t[i].join();
} catch (InterruptedException e) {
}
}
}
public byte[] getValid() {
return valid;
}
public boolean getDone() {
return done;
}
public void setDone(boolean done) {
this.done = done;
}
public static void main(String[] args) throws NoSuchAlgorithmException {
// Demo : find zzzzz blandt små bogstaver og tal
HashFinderMT hfmt = new HashFinderMT(4, "abcdefghijklmnopqrstuwvxyz0123456789");
hfmt.findHash(MessageDigest.getInstance("SHA-256").digest("zzzzzzzzzz".getBytes()));
}
}

class FinderThread extends Thread {
private MessageDigest md;
private int start;
private int end;
private HashFinderMT hfmt;
private byte[] buf;
byte[] target;
byte[] valid;
public FinderThread(int start, int end, HashFinderMT hfmt, int len, byte[] target) throws NoSuchAlgorithmException {
md = MessageDigest.getInstance("SHA-256");
this.start = start;
this.end = end;
this.hfmt = hfmt;
buf = new byte[len];
this.target = target;
valid = hfmt.getValid();
}
public void run() {
for(int i = start; i <= end; i++) {
buf[0] = valid[i];
checkAllHash(buf, 1);
}
}
public void checkAllHash(byte[] buf, int ix) {
if(hfmt.getDone()) return;
if(ix < buf.length) {
for(int i = 0; i < valid.length; i++) {
buf[ix] = valid[i];
checkAllHash(buf, ix + 1);
}
} else {
checkHash(buf);
}
}
public void checkHash(byte[] pw) {
if(Arrays.equals(md.digest(pw), target)) {
System.out.println("Found match: " + new String(pw));
hfmt.setDone(true);
}
}
}
Gravatar #95 - arne_v
6. jan. 2008 02:12
Og på min gamle P4:

C:\>java -server HashFinderMT
Checking all passwords of length 1
36000 checks per second
Checking all passwords of length 2
16405 checks per second
Checking all passwords of length 3
269687 checks per second
Checking all passwords of length 4
772947 checks per second
Checking all passwords of length 5
778160 checks per second
Checking all passwords of length 6
771955 checks per second
Checking all passwords of length 7
CTRL/C

En C2D eller C2Q bør kunne klare sig meget bedre.

Husk nyeste Java og brug -server !
Gravatar #96 - Jonasee
6. jan. 2008 02:22
#95

hvad med 64 bit er den optimert til det?
Gravatar #97 - arne_v
6. jan. 2008 02:32
#96

Java kode er forholdsvis 32/64 bit agnostic. Hvis du kører programmet i en 64 bit JVM så kører det 64 bit og det er op til JVM'en at udnytte addresse space (og nye instruktioner i x86-64). Jeg forventer ikke den store forskel på 32 bit og 64 bit performance, men jeg ved det ikke.

Hvis du har en 64 bit x86 og evt. har SUN Java i både 32 og 64 bit version, så kan du jo prøve om der er en forskel.
Gravatar #98 - Jace
6. jan. 2008 02:48
Forresten, alt det jeg lavede tilbage i #26.... Er det det der er en rainbow table?

#26 skrev:
62^8: 218.340.105.584.896 muligheder.

Hver mulighed indeholder 8 karaktere eller 8 bytes om man vil.

Det giver: 1.746.720.844.679.170 bytes

Til hver mulighed vil tabellen også indeholder den dertilhørende hash-værdi som er på 32 tegn eller bytes: 6.986.883.378.716.670 bytes

Tilsammen giver dette: 8.733.604.223.395.840 bytes.

Afrundet giver det:

8.733.604.223.395.840/1024/1024/1024/1024 = 7943 terabytes
Gravatar #99 - arne_v
6. jan. 2008 03:05
#98

Nej. Ikke helt.

En rainbow tabel kan finde alle hashes men gemmer kun nogle af dem.

http://en.wikipedia.org/wiki/Rainbow_table
Gravatar #100 - arne_v
6. jan. 2008 04:20
#85

Jeg kastede lige et blik på den VB.NET kode.

Jeg er ikke overrasket over at den kører langsomt.

Den er virkelig ringe.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login