Beveiligings script, is het veilig?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

11/06/2012 20:58:01
Quote Anchor link
Ik werk aan een veilige md5 hash codering op mijn eigen manier.
De input: test, hier geeft een output van 503 karakters die daarna met md5 worden geencrypt.
Maar is dit wel veilig?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
$string
= "test";
$string1 = str_replace("a", "9345df", $string);
$string2 = str_replace("b", "8FAsdf", $string1);
$string3 = str_replace("c", "724sfd", $string2);
$string4 = str_replace("d", "6SDFf2", $string3);
$string5 = str_replace("e", "5sfFDE", $string4);
$string6 = str_replace("f", "4GDSAf", $string5);
$string7 = str_replace("g", "3$3242", $string6);
$string8 = str_replace("h", "2$1has", $string7);
$string9 = str_replace("i", "1sdfhs", $string8);
$string10 = str_replace("j", "0435sd", $string9);
$string11 = str_replace("k", "1asdf2", $string10);
$string12 = str_replace("l", "2sf234", $string11);
$string13 = str_replace("m", "364sdf", $string12);
$string14 = str_replace("n", "47345d", $string13);
$string15 = str_replace("o", "58345s", $string14);
$string16 = str_replace("p", "6sfh345", $string15);
$string17 = str_replace("q", "7sf234s", $string16);
$string18 = str_replace("r", "8234sf5", $string17);
$string19 = str_replace("s", "9746sdf", $string18);
$string20 = str_replace("t", "0DSF345", $string19);
$string21 = str_replace("u", "9&435ds", $string20);
$string22 = str_replace("v", "824DFys", $string21);
$string23 = str_replace("w", "783DfsS", $string22);
$string24 = str_replace("x", "642635F", $string23);
$string25 = str_replace("y", "5245DFs", $string24);
$string26 = str_replace("z", "445Dasd", $string25);
$string27 = str_replace("A", "324sfsf", $string26);
$string28 = str_replace("B", "2FDsdfd", $string27);
$string29 = str_replace("C", "1DF#fsd", $string28);
$string30 = str_replace("D", "0##sdfs", $string29);
$string31 = str_replace("E", "1aasfsd", $string30);
$string32 = str_replace("F", "2nbsdfa", $string31);
$string33 = str_replace("G", "3gsdsfs", $string32);
$string34 = str_replace("H", "4ghdsad", $string33);
$string35 = str_replace("I", "5fghert", $string34);
$string36 = str_replace("J", "6456fhs", $string35);
$string37 = str_replace("K", "7jhgagf", $string36);
$string38 = str_replace("L", "8lkgj67", $string37);
$string39 = str_replace("M", "9ssddfg", $string38);
$string40 = str_replace("N", "0844sdf", $string39);
$string41 = str_replace("O", "1bbasdf", $string40);
$string42 = str_replace("P", "2hsaj54", $string41);
$string43 = str_replace("Q", "3jwadsf", $string42);
$string44 = str_replace("R", "4gh45df", $string43);
$string45 = str_replace("S", "5lsfdg4", $string44);
$string46 = str_replace("T", "68456fd", $string45);
$string47 = str_replace("U", "7hjgf64", $string46);
$string48 = str_replace("V", "8hgjr34", $string47);
$string49 = str_replace("W", "9jgfher", $string48);
$string50 = str_replace("X", "0djdaaa", $string49);
$string51 = str_replace("Y", "97535da", $string50);
$string52 = str_replace("Z", "8345734", $string51);
$string53 = str_replace("1", "7asdfdf", $string52);
$string54 = str_replace("2", "6kkksaf", $string53);
$string55 = str_replace("3", "537sgsd", $string54);
$string56 = str_replace("4", "4jjadfg", $string55);
$string57 = str_replace("5", "384dsgf", $string56);
$string58 = str_replace("6", "2hhhaaf", $string57);
$string59 = str_replace("7", "16234sd", $string58);
$string60 = str_replace("8", "0wwsfsd", $string59);
$string61 = str_replace("9", "144sdfs", $string60);
$string62 = str_replace("0", "2ppaasd", $string61);
$string63 = md5($string62);
?>
 
PHP hulp

PHP hulp

03/01/2025 10:10:04
 
Reshad F

Reshad F

11/06/2012 21:02:11
Quote Anchor link
lol waarom zo moeilijk?

gewoon salt en pepper gebruiken :)
 

11/06/2012 21:02:48
Quote Anchor link
Pepper ken ik niet, en een salt daar ben je zo langs. Maar langs dit kom je niet zo gemakkelijk zonder de source code, als het goed is :)
 
 - Diov  -

- Diov -

11/06/2012 21:02:51
Quote Anchor link
Reshad was me al voor...
Gewijzigd op 11/06/2012 21:03:07 door - Diov -
 

11/06/2012 21:10:00
Quote Anchor link
Een salt ou een mooie oplossing zijn, maar het probleem is dat deze meestal snel worden achterhaald. Ik probeer een andere oplossing te maken, die zelfs met een brute-force aanval jaren zal kosten om te kunnen kraken. En een string van 503 karakters voor een wachtwoord van 4 letters is toch aardig meegenomen.

Ik zou graag willen weten of dit script in de praktijk ook zou kunnen werken of dat iemand nu al een gat erin ziet, waarmee het script snel kan worden onderuitgehaald.
 
 - Diov  -

- Diov -

11/06/2012 21:14:53
Quote Anchor link
@ Cas,
je kan een dynamische code genereren per gebruiker (iets met de registratiedatum plus enkele seconden) en een zin van moeilijke woorden.

Velen zullen jouw manier niet toepassen, maar ik zeg niet dat het niet mogelijk is.
 

11/06/2012 21:17:07
Quote Anchor link
@Dem Ian,

Ik zal eens kijken of ik, dat wat jij nu zegt, kan combineren met wat ik nu heb. Want ik wil deze zeker gaan gebruiken, aangezien de md5 hash zo veel veiliger wordt, alleen er kunnen wel fouten in zitten helaas:S
 
Obelix Idefix

Obelix Idefix

11/06/2012 21:22:29
Quote Anchor link
MD5: Returns the hash as a 32-character hexadecimal number.
Geen 503 karakters dus.

Als je een salt van 47 tekens gebruikt en een pepper toevoegt, lijkt het me vrij lastig om het te kraken.
 
Reshad F

Reshad F

11/06/2012 21:48:18
Quote Anchor link
yep md5 heeft idd 32 chars.

probeer maar zoietss

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$salt
= 'sgvkjahguiahefuagelu28437293729874jdkchskdjhvksuyf8397498374hfsuhcakufy829374892dhakuwdha28222';

$password = "foo" . $salt;

$sql = "INSERT INTO ... WHERE ... = ... AND ... = '" . sha1($password) . "' "
?>
 
Roel -

Roel -

11/06/2012 23:24:22
Quote Anchor link
Lees a.u.b. de Notes op de php.net-website over de MD5-functie, waarin staat vermeld dat MD5 onveilig is. (hetzelfde geldt voor SHA1)

Lees hier waarom. Je kunt dus beter crypt of hash gebruiken. Succes! :-)
Gewijzigd op 11/06/2012 23:25:17 door Roel -
 

12/06/2012 08:58:26
Quote Anchor link
Ik bedoel, md5 is inderdaad 32 karakters, maar de string die in md5 wordt gehasht veranderd van 4 karakters in 503 karakters, waarmee rainbow table attacks/woordenboek aanvallen en brute force attacks nutteloos worden.

@Roel van de Water,
Het komt doordat er zoveel woordenboeken bestaan voor aanvallen, maar er bestaan geen woordenboeken met 503 karakter strings erin opgeslagen.
 
Erwin H

Erwin H

12/06/2012 09:17:43
Quote Anchor link
@Cas, volgens mij begrijp je het concept van brute force aanvallen niet helemaal. Brute force aanvallen pareer je niet met een betere encrypting van je wachtwoorden. Sterker, encrypten van wachtwoorden biedt geen enkele beveiliging tegen brute force aanvallen.

Toevoeging op 12/06/2012 09:23:06:

Overigens zit er ook nog een zwaar probleem in de methode die je nu probeert. Omdat je karakters 1 voor 1 aanpast, pas je ook karakters aan die in een vorige stap zijn aangepast. Probeer maar eens de string 'abab' nu te coderen.
stap 1(a): 9345dfb9345dfb
stap 2(b): 9345df8FAsdf9345df8FAsdf
stap 3(c): 9345df8FAsdf9345df8FAsdf
stap 4(d): 93456SDFf2f8FAs6SDFf2f93456SDFf2f8FAs6SDFf2f
stap 5(e): 93456SDFf2f8FAs6SDFf2f93456SDFf2f8FAs6SDFf2f
stap 6(f): 93456SDF4GDSAf24GDSAf8FAs6SDF4GDSAf24GDSAf93456SDF4GDSAf24GDSAf8FAs6SDF4GDSAf24GDSAf
 
De VeeWee

de VeeWee

12/06/2012 09:33:00
Quote Anchor link
md5 is niet veilig omdat het een snel encriptie algoritme is. Dis is onveilig voor bruteforce aanvallen.
Voor een goede (lees: trage) beveiliging met random salts kan je best bcrypt gebruiken. Ik wou hier vorige week nog een artikel over schrijven, maar het is er nog niet van gekomen. Hier alvast de uitleg:

http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html

Er zijn zo wel enkele classes te vinden op github, stackoverflow of gewoon in de huidige versie van Zend (_Crypt_Password_Bcrypt)
 
Albert de Wit

Albert de Wit

12/06/2012 11:00:11
Quote Anchor link
md5 hash is het niet echt, als je een wachtwoord van 15 karakters lang hebt heb je een hash van 6*15=90 letters en cijfers. Ik vind het wel creatief, werkt waarschijnlijk ook maar het neemt heel wat ruimte in beslag in een database denk ik.
 

12/06/2012 22:58:40
Quote Anchor link
@Erwin H,
De brute-force gedeelte had er niet in moeten staan, stom dat ik het nu pas zelf zie. Ik heb het waarschijnlijk zonder na te denken ingetypt.

En de fout die jij noemde, is juist de beveiligings methode. Door elke verandere karakter, ook weer te veranderen, krijg je een string van enorme grootheid. Waardoor woordenboek-aanvallen, niet meer werken.

@de VeeWee,
Bedankt voor de link, ik ga er eens wat aandacht aan besteden morgen.

@Albert de Wit,
Omdat de string daarna naar md5 wordt omgezet, neemt het weinig ruimte in de database in beslag.
 
Erwin H

Erwin H

13/06/2012 07:34:59
Quote Anchor link
Cas Buijs op 12/06/2012 22:58:40:
En de fout die jij noemde, is juist de beveiligings methode. Door elke verandere karakter, ook weer te veranderen, krijg je een string van enorme grootheid. Waardoor woordenboek-aanvallen, niet meer werken.

Het gebruik van brute force was een foutje.... het gebruik van woordenboek-aanvallen hier dan ook. Ook dat soort aanvallen pareer je hier niet mee.
 
Obelix Idefix

Obelix Idefix

13/06/2012 08:08:19
Quote Anchor link
Je string wordt misschien wel (enorm) groot, maar door md5 blijft je hash 32 tekens.
Gewijzigd op 13/06/2012 08:08:40 door Obelix Idefix
 

13/06/2012 11:11:37
Quote Anchor link
@Erwin H,
Een woordenboek aanval codeerd de woorden naar md5 en vergelijkt dan de md5 hashes. Met deze manier wordt de string enorm en wanneer een woordenboek het vergelijkt, zal niets matchen, omdat er geen enkel woordenboek is met verschillende 503 lange karakterreeksen. (Als ik het fout heb, hoor ik het graag van je:))

@Obelix en Idefix,
Dat is juist het mooie, dat de hash 32 tekens is, maar de string enkele honderden tekens. Daarmee schakel je woordenboek aanvallen uit.
Gewijzigd op 13/06/2012 11:19:31 door
 
De VeeWee

de VeeWee

13/06/2012 11:37:46
Quote Anchor link
@Cas,

Je moet wel weten dat een hash-functie een invoerwaarde omzet naar een hash.
Deze hash kan voor 2 verschillende invoerwaarden wel hetzelfde zijn. Bij een goede hash-functie is deze kans natuurlijk klein. Maar het is mogelijk.

Als er dus iemand uw lijst can wachtwoorden heeft, kan hij nog altijd een collision attack proberen op basis van de input en/of output strings in zijn woordenboek.

Vandaar dat het een betere keuze is om een trage hash methode te nemen. op deze manier kan je het kraken hard tegengaan. Even een voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
$tests
= 5;
$bcrypt = new Bcrypt(15);

$password = 'abcc!@MLK12345';
$badPassword = 'invalid';

// test md5 hashing
$hashes = array();
$start = microtime(true);
for($i=0; $i<$tests; $i++) {
    $hashes[] = md5($password);
}

$stop = microtime(true);
echo('Took: ' . ($stop - $start) . 's for parsing ' . $tests . ' passwords with md5' . PHP_EOL);
var_dump($hashes);


// test sha1 hashing
$hashes = array();
$start = microtime(true);
for($i=0; $i<$tests; $i++) {
    $hashes[] = sha1($password);
}

$stop = microtime(true);
echo('Took: ' . ($stop - $start) . 's for parsing ' . $tests . ' passwords with sha1' . PHP_EOL);
var_dump($hashes);



// test bcrypt hashing
$hashes = array();
$start = microtime(true);
for($i=0; $i<$tests; $i++) {
    $hashes[] = $bcrypt->hash($password);
}

$stop = microtime(true);
echo('Took: ' . ($stop - $start) . 's for parsing ' . $tests . ' passwords with bcrypt' . PHP_EOL);
var_dump($hashes);

// test bcrypt validation
$results = array();
$start = microtime(true);
for($i=0; $i<$tests; $i++) {
    $results[] = $bcrypt->verify($password, $hashes[$i]);
    $results[] = $bcrypt->verify($badPassword, $hashes[$i]);
}

$stop = microtime(true);
echo('Took: ' . ($stop - $start) . 's for verifying ' . ($tests * 2) . ' passwords' . PHP_EOL);
var_dump($results);
?>


Dit geeft als resultaat (op mijn trage computer)
Quote:
C:\wamp\www>php bcrypt.php
Took: 0.00032591819763184s for parsing 5 passwords with md5
array(5) {
[0]=>
string(32) "a1d775dfcae6962278f78c690599f00f"
[1]=>
string(32) "a1d775dfcae6962278f78c690599f00f"
[2]=>
string(32) "a1d775dfcae6962278f78c690599f00f"
[3]=>
string(32) "a1d775dfcae6962278f78c690599f00f"
[4]=>
string(32) "a1d775dfcae6962278f78c690599f00f"
}
Took: 3.7908554077148E-5s for parsing 5 passwords with sha1
array(5) {
[0]=>
string(40) "77ed63f4ab4331e1ab24e2ef43c342fa260bfe55"
[1]=>
string(40) "77ed63f4ab4331e1ab24e2ef43c342fa260bfe55"
[2]=>
string(40) "77ed63f4ab4331e1ab24e2ef43c342fa260bfe55"
[3]=>
string(40) "77ed63f4ab4331e1ab24e2ef43c342fa260bfe55"
[4]=>
string(40) "77ed63f4ab4331e1ab24e2ef43c342fa260bfe55"
}
Took: 16.322055101395s for parsing 5 passwords with bcrypt
array(5) {
[0]=>
string(60) "$2a$15$rj7eSnwqW5qWE/QNY5EMROJgx06VmVDZR8If4KFzREUOI9k3pZ6ii"
[1]=>
string(60) "$2a$15$2th7FaF87Cyp55MEQeqr8ubOoAg6JQwkJooEK3n4Eq0UKhrdVpv1W"
[2]=>
string(60) "$2a$15$jrE7.gWGYHGNiUcjkSNSSOg/xyGkNtq4bYiHenxp0oN6sni43a31G"
[3]=>
string(60) "$2a$15$CR.uYrV1OZ5r05FS0dS98.ZACzuzdIeCnj6IgstnroMxG6zpxfD5."
[4]=>
string(60) "$2a$15$u3aVvR6hALRGQNyYWE/O/.CSVBJyCIZFK4IwCwKwyZIP2eCYOlUnS"
}
Took: 32.637322902679s for verifying 10 passwords
array(10) {
[0]=>
bool(true)
[1]=>
bool(false)
[2]=>
bool(true)
[3]=>
bool(false)
[4]=>
bool(true)
[5]=>
bool(false)
[6]=>
bool(true)
[7]=>
bool(false)
[8]=>
bool(true)
[9]=>
bool(false)
}


Zoals je kan zien, kan ik op 32 seconden 10 bcrypt hashes checken.
Op deze tijd heb ik 484848 md5 wachtwoorden gecheckt!

Zo duurt het dus eeuwen voor de hacker over heel uw database met wachtwoorden geraakt. De hacker zal het opgeven omdat het veel te lang duurt!

Je kan ook zien dat die bcrypt een random hash gebruikt in het resultaat en toch juist valideert! Dit komt omdat het protocol een random salt aanmaakt. Je kan het bcrypt protocol vertragen door de parameter in 'new Bcrypt(15)' te verhogen. Het protocol is dus aanpasbaar in snelheid, jij bepaalt hoe snel iets moet zijn.

Om 1 wachtwoord te encrypten op je website, zal de gebruiker hier amper iets van merken. Hij zal zelfs blij zijn dat het inloggen en registreren veilig is. Maar als je vele wachtwoorden hebt, dan ben je toch zeker dat het niet zomaar gekraakt zal geraken!
Gewijzigd op 13/06/2012 11:58:19 door de VeeWee
 

13/06/2012 12:52:49
Quote Anchor link
@de VeeWee,

Ik sta gewoon te kijken van wat je hier laat zien.
Had ik nog nooit van gehoord eerlijk gezegt, dat je snelheid kon aanpassen.

Ik ga hier zeker verder naar kijken en gebruiken, dit is zeer handig. Dankjewel voor je reactie:)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.