Wat kan er beter?
Code (php)
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST') {
// controle op pass
$public_key = 'mx9unmcq87NSuiy87hiOHio8hJIO8UH89oh';
$get_p_key = "SELECT p_key FROM sfi_users WHERE naam = '" . mysql_real_escape_string($_POST['naam']) . "'";
$get = mysql_query($get_p_key);
if(!$get) {
Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
}
$fetch = mysql_fetch_assoc($query);
$password = sha1( $public_key . $_POST['pass'] . $fetch['p_key'] );
$select = "SELECT naam, pass FROM sfi_users WHERE naam ='" . mysql_real_escape_string($_POST['naam']) . "' AND pass = '" . $password . "'";
$query = mysql_query($select);
if(!$query) {
Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
}
$rows = mysql_num_rows($query);
$fetch = mysql_fetch_assoc($query);
if($rows == 0) {
$error = 'Onjuiste naam en wachtwoord!';
if(isset($_POST['naam']) || isset($_POST['pass'])) {
// zet in de logs
$log = mysql_query("INSERT INTO sfi_logs (naam, pass, datum, ip ) VALUES ('" . mysql_real_escape_string($_POST['naam']) . "', '" . mysql_real_escape_string($_POST['pass']) . "', NOW(), '" . $_SERVER['REMOTE_ADDR'] . "')");
if(!$log) {
Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
}
}
}
if($rows == 1) {
$_SESSION['naam'] = $_POST['naam'];
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
}
?>
<div class="home-title">
<center> Admin panel</center>
</div>
<div class='content'>
<?php
if(isset($_SESSION['naam']) || isset($_SESSION['ip'])) {
Echo 'Welkom '. $_SESSION['naam'];
// laat menu zien
} Else {
?>
<br /> <center> <u>
<?php
if(isset($error)) {
Echo $error;
}
?></u>
<br /><br />
<form action='' method='post' >
<b>Username: </b><input name='naam' type='text' /><br />
<b>password: </b><input name='pass' type='password' /><br />
<input type='submit' value='log in' /><br />
</form>
</center>
<?php
}
?>
</div>
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST') {
// controle op pass
$public_key = 'mx9unmcq87NSuiy87hiOHio8hJIO8UH89oh';
$get_p_key = "SELECT p_key FROM sfi_users WHERE naam = '" . mysql_real_escape_string($_POST['naam']) . "'";
$get = mysql_query($get_p_key);
if(!$get) {
Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
}
$fetch = mysql_fetch_assoc($query);
$password = sha1( $public_key . $_POST['pass'] . $fetch['p_key'] );
$select = "SELECT naam, pass FROM sfi_users WHERE naam ='" . mysql_real_escape_string($_POST['naam']) . "' AND pass = '" . $password . "'";
$query = mysql_query($select);
if(!$query) {
Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
}
$rows = mysql_num_rows($query);
$fetch = mysql_fetch_assoc($query);
if($rows == 0) {
$error = 'Onjuiste naam en wachtwoord!';
if(isset($_POST['naam']) || isset($_POST['pass'])) {
// zet in de logs
$log = mysql_query("INSERT INTO sfi_logs (naam, pass, datum, ip ) VALUES ('" . mysql_real_escape_string($_POST['naam']) . "', '" . mysql_real_escape_string($_POST['pass']) . "', NOW(), '" . $_SERVER['REMOTE_ADDR'] . "')");
if(!$log) {
Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
}
}
}
if($rows == 1) {
$_SESSION['naam'] = $_POST['naam'];
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
}
?>
<div class="home-title">
<center> Admin panel</center>
</div>
<div class='content'>
<?php
if(isset($_SESSION['naam']) || isset($_SESSION['ip'])) {
Echo 'Welkom '. $_SESSION['naam'];
// laat menu zien
} Else {
?>
<br /> <center> <u>
<?php
if(isset($error)) {
Echo $error;
}
?></u>
<br /><br />
<form action='' method='post' >
<b>Username: </b><input name='naam' type='text' /><br />
<b>password: </b><input name='pass' type='password' /><br />
<input type='submit' value='log in' /><br />
</form>
</center>
<?php
}
?>
</div>
Is deze code veilig?
Wat kan er beter?
Het is een adminlogin script wat ik het liefst heel veilig wil hebben
Gewijzigd op 13/02/2011 11:41:46 door Jordi Kroon
Overigens mis ik de 'salt' + 'pepper'.
En uiteraard de foutafhandeling van de query nog even fixen ;)
Toevoeging op 12/02/2011 20:39:47:
code aangepast en fouthandeling toegevoegd ook de escape van pass afgehaald
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$salt = 'asdfljhasdlfjhwutylbjsadf81746al;sdjkf7856012834'
$pepper = 'a;idjfh;auwehr08754jasdfhp16y23756da;gjnmbnadsjh6p8';
$password = sha1( $salt . $_POST['pass'] . $pepper );
$salt = 'asdfljhasdlfjhwutylbjsadf81746al;sdjkf7856012834'
$pepper = 'a;idjfh;auwehr08754jasdfhp16y23756da;gjnmbnadsjh6p8';
$password = sha1( $salt . $_POST['pass'] . $pepper );
Is het veiliger om zegmaar per gebruiker een random salt + pepper aan te maken die in de database te stoppen en ophalen bij het password te zetten?
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$query = mysql_query($select);
$rows = mysql_num_rows($query);
if(!$query) {
Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
}
?>
$query = mysql_query($select);
$rows = mysql_num_rows($query);
if(!$query) {
Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
}
?>
Ook niet echt de manier lijkt mij.
Getallen hoeven nog steeds niet tussen quotes te staan.
Wat gebeurt er als $_SESSION['naam'] niet bestaat?
Code (php)
Als er nog niets is gepost zal $error niet bestaan.
Gewijzigd op 12/02/2011 23:49:40 door - SanThe -
Jordi kroon op 12/02/2011 21:39:07:
Is het veiliger om zegmaar per gebruiker een random salt + pepper aan te maken die in de database te stoppen en ophalen bij het password te zetten?
Meestal niet. Want je kan niet echt dynamisch te werk gaan. Wanneer je bijvoorbeeld time() zou gebruiken als $salt, dan gaat dat niet lukken. Want jij gaat in de database iets opslaan wat uniek is, en nooit meer kan worden nagemaakt (tenzij manueel dan, maar dan heb je geen loginscript meer). De enige mogelijkheid is iets te doen met bepaalde gegevens. Bijvoorbeeld sha1(md5($user.md5($user))) Maar goed, dat heeft niet zozeer een meerwaarde, want meestal heb je zoiets al rond je $user staan ;-).
@santhe dat kwam omdat ik die er later in had gedaan ik zal morgen eventjes die puntjes fixen
Als $error niet bestaat weergeefd hij hem ook niet:)
Bij sessie als de sessie niet bestaat weergeeft hij het inlog formulier
Jordi kroon op 12/02/2011 21:39:07:
Is het veiliger om zegmaar per gebruiker een random salt + pepper aan te maken die in de database te stoppen en ophalen bij het password te zetten?
Ja, al is salt + iteratie (hoe vaak er gehashed moet worden) beter.
Sla dus per user de salt, de iteratie en de uiteindelijke hash op.
Code (php)
Of zoek eens naar Bcrypt
Gewijzigd op 13/02/2011 00:28:23 door Dos Moonen
Jordi kroon op 13/02/2011 00:06:33:
Als $error niet bestaat weergeefd hij hem ook niet:)
Maar je krijgt wel een Notice.
Hoe kan ik dat dan het beste doen?
isset($error) gebruiken
En wat dos Moonen zij erin verwerkt
Is er nog iets wat beter kan
Regel 21 (en verder) wordt uitgevoerd ook als de query mislukt is, en geeft dan dus een error.
- SanThe - op 12/02/2011 23:48:56:
Wat gebeurt er als $_SESSION['naam'] niet bestaat en $_SESSION['ip'] bestaat wél? Dan krijg je een Notice.
Met x als kans op botsing bij 1x hashen en n als hoeveelheid iteraties, wordt de kans
(1-x)^n en dus veel groter bij meerdere hashes.
Als je het heel veilig wil hebben, gebruik dan gewoon sha512 en een lange dynamische salt.
Pim - op 13/02/2011 13:00:18:
Meerdere keren hashen is onzin. Omdat vaak wordt aangeraden met een white-box aan te namen - de gebruikte techniek is bij de aanvaller bekend - verhoogt meerdere keren hashen alleen de kans op een 'botsing'.
Het leuke van die code die ik plaatste is dat een hash genereren ongeveer 1337 keer langer duurt dat wanneer je het maar 1 keer hashed.
Dus tenzij de aanvallen kan bewijzen (en dit zal hij per unieke user salt en iteratie combinatie opnieuw moeten berekenen) dat het met x < 1337 iteraties je de zelfde output krijgt zal de aanvaller dus ook 1337 keer moeten hashen.
Waardoor bruteforcen ook zo'n 1337 langer gaat duren.
Als er iets mis is met mijn logica hoor ik het graag.
Het leuke van hashen is dat het voor jou een kleine moeite is, maar voor een aanvaller die moet bruteforcen en hoop gedoe. Bij 1337 keer hashen duurt het echter voor beide partijen 1337 keer langer en dat is voor de server nadelig. Ook verlaag je het aantal gemiddeld benodigde pogingen drastisch, zoals ik in mijn vorige post al zei.
http://en.wikipedia.org/wiki/Key_strengthening
Maar het is alleen handig met een hoge (ergens in de duizenden) iteratie, met een iteratie van 15 is het inderdaad niet aan te raden.
Maar het is alleen handig met een hoge (ergens in de duizenden) iteratie, met een iteratie van 15 is het inderdaad niet aan te raden.
Gewijzigd op 13/02/2011 16:29:12 door Dos Moonen
Dit artikel gaat wel over hashes die gebruikt worden als versleutel-sleutels, niet als hash op zich, maar ik weet niet of dat uitmaakt. Wel heb ik echt op veel plekken gelezen dat herhaalde hashing geen goed idee is.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function hashstring($string) {
$string = strip_tags( mysql_real_escape_string( $string ) );
$md5 = md5( $string );
$sha1 = sha1( $string );
$sha1md5 = sha1( md5( sha1( $sha1 ) ) );
$letters = array( "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", 0 );
$substr = substr( str_replace( $letters, null, $sha1md5 ) , 0, 10 );
$substrend = substr( str_replace( $letters, null, sha1( md5( sha1( $substr ) ) ) ), 0, 10 );
print $substrend;
}
echo hashstring('Hallo');
?>
function hashstring($string) {
$string = strip_tags( mysql_real_escape_string( $string ) );
$md5 = md5( $string );
$sha1 = sha1( $string );
$sha1md5 = sha1( md5( sha1( $sha1 ) ) );
$letters = array( "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", 0 );
$substr = substr( str_replace( $letters, null, $sha1md5 ) , 0, 10 );
$substrend = substr( str_replace( $letters, null, sha1( md5( sha1( $substr ) ) ) ), 0, 10 );
print $substrend;
}
echo hashstring('Hallo');
?>
nooit meerdere hashes in 1 doen :)