secret salt in sha1 wachtwoorden in database
Ik heb een inlog script gemaakt:
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
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
<!-- mijn sha1hash functiee hierin: -->
<script type="text/javascript" src="/js/functions.js"></script>
<?php
if(!empty($_POST) && isset($_POST['action']) && $_POST['action'] == 'login'){
$qry = mysql_query("SELECT usr_id FROM tbl_users WHERE sha1(concat('".$_SESSION['salt_logon_username'].":' , sha1(usr_username)))='".addslashes($_POST['post_username'])."' AND sha1(concat('".$_SESSION['salt_logon_password'].":' , usr_password))='".addslashes($_POST['post_password'])."'");
$accepted = mysql_numrows($qry);
if ($accepted == 1){
echo "login succeed:)";}
else {
echo "Sorry, your login was incorrect";
}
}
$_SESSION['salt_logon_username'] = str_shuffle(base64_encode((string)rand(0,9000000)));
$_SESSION['salt_logon_password'] = str_shuffle(base64_encode((string)rand(0,9000000)));
?>
<script type="text/javascript">
function do_logon()
{
var salt_username = '<?= $_SESSION['salt_logon_username'] ?>';
var salt_password = '<?= $_SESSION['salt_logon_password'] ?>';
document.getElementById('post_username').value = sha1hash(salt_username + ':' + sha1hash(document.getElementById('username').value.toLowerCase()));
document.getElementById('post_password').value = sha1hash(salt_password + ':' + sha1hash(document.getElementById('username').value.toLowerCase() + ':' + document.getElementById('password').value));
document.getElementById('username').value = '';
document.getElementById('password').value = '';
return true;
}
</script>
<BR><BR>
<form id="login" method="post" action="" onsubmit="return do_logon();">
<input type="hidden" name="action" id="action" value="login">
<input type="hidden" name="post_username" id="post_username" value="">
<input type="hidden" name="post_password" id="post_password" value="">
Username <input type="text" name="username" id="username" value=""><BR>
Password <input type="password" name="password" id="password" value=""><BR>
<input type="submit" value="login" >
</form>
<script type="text/javascript" src="/js/functions.js"></script>
<?php
if(!empty($_POST) && isset($_POST['action']) && $_POST['action'] == 'login'){
$qry = mysql_query("SELECT usr_id FROM tbl_users WHERE sha1(concat('".$_SESSION['salt_logon_username'].":' , sha1(usr_username)))='".addslashes($_POST['post_username'])."' AND sha1(concat('".$_SESSION['salt_logon_password'].":' , usr_password))='".addslashes($_POST['post_password'])."'");
$accepted = mysql_numrows($qry);
if ($accepted == 1){
echo "login succeed:)";}
else {
echo "Sorry, your login was incorrect";
}
}
$_SESSION['salt_logon_username'] = str_shuffle(base64_encode((string)rand(0,9000000)));
$_SESSION['salt_logon_password'] = str_shuffle(base64_encode((string)rand(0,9000000)));
?>
<script type="text/javascript">
function do_logon()
{
var salt_username = '<?= $_SESSION['salt_logon_username'] ?>';
var salt_password = '<?= $_SESSION['salt_logon_password'] ?>';
document.getElementById('post_username').value = sha1hash(salt_username + ':' + sha1hash(document.getElementById('username').value.toLowerCase()));
document.getElementById('post_password').value = sha1hash(salt_password + ':' + sha1hash(document.getElementById('username').value.toLowerCase() + ':' + document.getElementById('password').value));
document.getElementById('username').value = '';
document.getElementById('password').value = '';
return true;
}
</script>
<BR><BR>
<form id="login" method="post" action="" onsubmit="return do_logon();">
<input type="hidden" name="action" id="action" value="login">
<input type="hidden" name="post_username" id="post_username" value="">
<input type="hidden" name="post_password" id="post_password" value="">
Username <input type="text" name="username" id="username" value=""><BR>
Password <input type="password" name="password" id="password" value=""><BR>
<input type="submit" value="login" >
</form>
die de username en password van een gebruiker versleuteld over het nerwerk heen stuurt, zodat iemand met een sniffer geen kans maakt. Ik heb er ook een salt aan gekoppeld die maar 1 keer geldig is, dus een cracker de gesniffte gegevens niet nog een keer kan gebruiken.
Ik heb wachtwoorden in mijn database als volgt opgeslagen:
$password = sha1('username' . ':' . 'password');
als je nu naar dit stuk van het script hierboven kijkt (waar het script checked of het password overeen komt met de user):
Code (php)
1
AND sha1(concat('".$_SESSION['salt_logon_password'].":' , usr_password))='".addslashes($_POST['post_password'])."'");
dan kun je daaruit opmaken dat ik een probleem krijg als ik een geheime salt wil toevoegen aan mijn wachtwoorden in de database:
$secret_salt = "#24-Fks^-=>";
$password = sha1($secret_salt . ':' . 'username' . ':' . 'password');
(omdat ik het wachtwoord al met een andere salt post..)
Dit wil ik graag, omdat een hacker die de wachtwoorden uit mijn db zou kunnen lezen er dan nooit achter kan komen wat nou eigenlijk het wachtwoord is en deze gebruiken om in te loggen.
vraag:
Weet iemand hoe ik het toch een geheime salt kan gebruiken voor de wachtwoorden in mijn database zonder mijn geheime salt in javascript te zetten of uberhaupt ergens prijs te geven?
(session hijacking is hiernaast nog mogelijk, maar hier heb ik een andere beveiliging voor)
.
Gewijzigd op 01/01/1970 01:00:00 door Bo Bo
Waarom zou je in hemelsnaam in javascript je wachtwoord/gebruikersnaam willen zetten?
ik gebruik javascript alleen om het te encrypten om het naar de server te posten zodat een 'man-in-the-middle' met een sniffer er nooit achter kan komen met welke gebruikersnaam en wachtwoord er word ingelogged.
Bo Bo op 21/10/2008 18:27:00:
hoezo wachtwoord/gebruikersnaam in javascript zetten?
ik gebruik javascript alleen om het te encrypten om het naar de server te posten zodat een 'man-in-the-middle' met een sniffer er nooit achter kan komen met welke gebruikersnaam en wachtwoord er word ingelogged.
ik gebruik javascript alleen om het te encrypten om het naar de server te posten zodat een 'man-in-the-middle' met een sniffer er nooit achter kan komen met welke gebruikersnaam en wachtwoord er word ingelogged.
Maar is het dan niet zo dat je alsnog kan inloggen via een XSS injectie met de hash die Javascript normaal aanmaakt?
Bo Bo op 21/10/2008 18:27:00:
hoezo wachtwoord/gebruikersnaam in javascript zetten?
ik gebruik javascript alleen om het te encrypten om het naar de server te posten zodat een 'man-in-the-middle' met een sniffer er nooit achter kan komen met welke gebruikersnaam en wachtwoord er word ingelogged.
ik gebruik javascript alleen om het te encrypten om het naar de server te posten zodat een 'man-in-the-middle' met een sniffer er nooit achter kan komen met welke gebruikersnaam en wachtwoord er word ingelogged.
Maar hij kan nog steeds inloggen. Hij hoeft het wachtwoord niet te weten, hij moet enkel dezelfde pakketjes nogmaals versturen. Eventueel met nieuwe sessie, als hij in de username en password fields dezelfde gegevens stopt als wat jouw javascript heeft gegenereerd dan is hij binnen. Of jouw javascript die hash nu maakt of hij de onderschepte pakketjes opnieuw verstuurd ziet de server niet. Het houdt wellicht een newbie tegen of de hackers die alleen 'makkelijke' doelen aanvallen, maar het blijft een soort nepveiligheid. Enige echte oplossing: HTTPS.