Browse Source

Implémente le salage du mot de passe utilisateur

La situation actuelle est fonctionnelle, mais hybride. Le sel est stocké
en base de données plutôt que dans un fichier de configuration. Il est
changé à chaque changement du mot de passe. Le 'constant.php' est généré
en une fois à l'installation et est difficile à modifier.
Par la suite, les sels devront être stockés avec les comptes
utilisateurs et cela nécessitera de modifier le schéma de la base. Un
sel de déploiement pourra être ajouté, dans le fichier de configuration.

Sauf erreur, le sel est fonctionnel pour les nouvelles installations. La
variable de configuration 'cryptographicSalt' stocke le sel. Ce sel
change à chaque changement de mot de passe.
Le sel est également fonctionnel pour les anciennes installations. En
l'absence de cette variable, le sel est considéré comme une chaîne vide
et passe le hachage de façon transparente. Au prochain changement de mot
de passe, la variable de configuration est ajouté et le reste se déroule
comme pour une nouvelle installation.
Christophe HENRY 7 years ago
parent
commit
9faa2781bf
3 changed files with 33 additions and 9 deletions
  1. 9 6
      User.class.php
  2. 20 2
      action.php
  3. 4 1
      install.php

+ 9 - 6
User.class.php

@@ -26,9 +26,9 @@ class User extends MysqlEntity{
 		$this->id = $id;
 	}
 
-	function exist($login,$password){
+	function exist($login,$password,$salt=''){
 		$userManager = new User();
-		return $userManager->load(array('login'=>$login,'password'=>User::encrypt($password)));
+		return $userManager->load(array('login'=>$login,'password'=>User::encrypt($password,$salt)));
 	}
 
 	function getToken() {
@@ -73,14 +73,17 @@ class User extends MysqlEntity{
 		return $this->password;
 	}
 
-	function setPassword($password){
-		$this->password = User::encrypt($password);
+	function setPassword($password,$salt=''){
+		$this->password = User::encrypt($password,$salt);
 	}
 
-	static function encrypt($password){
-		return sha1($password);
+	static function encrypt($password, $salt=''){
+		return sha1($password.$salt);
 	}
 
+	static function generateSalt() {
+		return ''.mt_rand().mt_rand();
+	}
 
 }
 

+ 20 - 2
action.php

@@ -190,7 +190,23 @@ switch ($action){
 			$configurationManager->put('feedMaxEvents',$_['feedMaxEvents']);
 
 			$userManager->change(array('login'=>$_['login']),array('id'=>$myUser->getId()));
-			if(trim($_['password'])!='') $userManager->change(array('password'=>User::encrypt($_['password'])),array('id'=>$myUser->getId()));
+			if(trim($_['password'])!='') {
+				$salt = User::generateSalt();
+				$userManager->change(array('password'=>User::encrypt($_['password'], $salt)),array('id'=>$myUser->getId()));
+				/* /!\ En multi-utilisateur, il faudra changer l'information au
+				niveau du compte lui-même et non au niveau du déploiement comme
+				ici. C'est ainsi parce que c'est plus efficace de stocker le sel
+				dans la config que dans le fichier de constantes, difficile à
+				modifier. */
+				$oldSalt = $configurationManager->get('cryptographicSalt');
+				if (empty($oldSalt))
+					/* Pendant la migration à ce système, les déploiements
+					ne posséderont pas cette donnée. */
+					$configurationManager->add('cryptographicSalt', $salt);
+				else
+					$configurationManager->change(array('value'=>$salt), array('key'=>'cryptographicSalt'));
+				
+			}
 
 	header('location: ./settings.php#preferenceBloc');
 	break;
@@ -466,7 +482,9 @@ switch ($action){
 				header('location: ./action.php?action=addFeed&newUrl='.$_['newUrl']);
 			}
 		}else{
-				$user = $userManager->exist($_['login'],$_['password']);
+			$salt = $configurationManager->get('cryptographicSalt');
+			if (empty($salt)) $salt = '';
+			$user = $userManager->exist($_['login'],$_['password'],$salt);
 			if($user==false){
 				exit("erreur identification : le compte est inexistant");
 			}else{

+ 4 - 1
install.php

@@ -131,6 +131,8 @@ if(isset($_['installButton'])){
 	$folderManager = new Folder();
 	$configurationManager = new Configuration();
 
+	$cryptographicSalt = User::generateSalt();
+	
 	//Création de la base et des tables
 	$feedManager->create();
 	$eventManager->create();
@@ -140,7 +142,7 @@ if(isset($_['installButton'])){
 	//Ajout de l'administrateur
 	$admin = new User();
 	$admin->setLogin($_['login']);
-	$admin->setPassword($_['password']);
+	$admin->setPassword($_['password'],$cryptographicSalt);
 	$admin->save();
 	//Identification de l'utilisateur en session
 	$_SESSION['currentUser'] = serialize($admin);
@@ -165,6 +167,7 @@ if(isset($_['installButton'])){
 	$configurationManager->add('synchronisationCode',$synchronisationCode);
 	$configurationManager->add('synchronisationEnableCache',$_['synchronisationEnableCache']);
 	$configurationManager->add('synchronisationForceFeed',$_['synchronisationForceFeed']);
+	$configurationManager->add('cryptographicSalt', $cryptographicSalt);
 
 	//Création du dossier de base
 	$folder = $folderManager->load(array('id'=>1));