salt meegeven bij sha1 wachtwoorden in database

Status
Niet open voor verdere reacties.

wake

Gebruiker
Lid geworden
21 aug 2007
Berichten
195
Hallo,

Ik heb een inlog script gemaakt:

PHP:
<!-- 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>

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):
PHP:
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)

.
 
Laatst bewerkt:
en zou het een probleem zijn dat een eventuele hacker weet hoe ik mijn wachtwoorden encrypted in de database zet? (omdat dit te zien is in mijn javascript?)
 
Wachtwoorden sla je alvast niet op in sessies, verder snap ik je vraag niet helemaal. Een salt is bij mij gewoon een constante die ik altijd toevoeg.
 
ik sla mn wachtwoord ook niet op in een sessie, wel de salt die erbij hoort.

mijn vraag is heel simpel.

ik wil mijn wachtwoorden in de database beveiligen met een geheime salt. deze moet mee geencrypt worden met de gebruikersnaam en zijn wachtwoord tot een sha1.

omdat ik dat script hierboven gebruik om man-in-the-middle tegen te gaan kan ik die salt niet in mijn sha1-wachtwoord (in de database) toevoegen omdat ik al een salt gebruik in mn script hierboven en dus de wachtwoorden niet meer kan vergelijken met elkaar.

snap je hem nou?:eek:
 
Dan klopt je script gewoon niet, maar ik ga 'm niet helemaal doorkijken.

In principe doe je het zo:

PHP:
// Dit bij voorkeur buiten je root.
define('SALT', 'adkfja2342342g3j4j');


$sQuery = "SELECT id_user FROM users WHERE password = '" . sha1(SALT.$_POST['password'] . "'";
 
Daarnaast heb ik je script wel gezien, maar ga ik 'm niet van boven tot onder lezen en verbeteren. Wat ik wel zie, is dat het onveilig is. Ik geef je suggesties, waaruit je kunt opmaken hoe het hoort, maar dat interesseert je blijkbaar niets.
 
Laatst bewerkt door een moderator:
bij mij moet de salt waarmee ik de wachtwoorden in de database wil zetten ook constant zijn.
ik gebruik alleen de dynamische salt(die alleen gebruikt word voor de verzending van het wachtwoord en username over het netwerk en niet opsla in de database) om bij iedere inlog een ander ge-encrypte string over het netwerk heen te sturen die maar 1 keer te gebruiken is. zodat een sniffer geen kans maakt. (over andere hack en crack methodes niet gesproken)


en ik weet dat het niet goed is prijs te geven hoe ik wachtwoorden encrypt die ik in mijn database wegschrijf. maar dit is altijd beter dan gewoon plaintext de gebruikersnaam en wachtwoord te versturen.
en daarom wil ik juist nog een constante salt erbij om wachtwoorden weg te schrijven in mijn database.. maar ik kan dus niet uitgedacht krijgen hoe ik dat voor elkaar krijg in combinatie met mijn ge-encrypte post's (username en wachtwoord)


Dan klopt je script gewoon niet, maar ik ga 'm niet helemaal doorkijken.

In principe doe je het zo:

PHP:
// Dit bij voorkeur buiten je root.
define('SALT', 'adkfja2342342g3j4j');

$sQuery = "SELECT id_user FROM users WHERE password = '" . sha1(SALT.$_POST['password'] . "'";

doordat ik al een dynamische salt gebruik om mijn wachtwoord te vergelijken.. zie script.. kan ik nu geen gebruik maken van een constante salt die ik in de encryptie zet in de database door de dynamische salt. wat jij hierboven zegt snap ik ook wel maar dat lost mijn probleem niet op.

Nou zeg jij net dus dat jij mij suggesties geeft hoe ik het veiliger kan maken. nou weet ik niet of ik die over het hoofd heb gezien? maar ik zie ze niet staan.

verder kan ik me niet bedenken wel gedeelte van mijn data encryptie voor het verzenden van 'posts' over het netwerk niet veilig is. Volgensmij kan een sniffer nooit een gebruikersnaam of wachtwoord achterhalen.

.
 
Laatst bewerkt door een moderator:
Heren, laten we het wel vriendelijk houden.

Bij deze de thread even opgeschoont.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan