Browse Source

On ajoute un algorithme de hash, plus propre plutot que de chiffrer/dechiffrer la colonne pass, la MAJ sera faite au fil des connexions

master
root-www 11 months ago
parent
commit
1ed35bde31
  1. 41
      auth/spip.php
  2. 13
      chiffrer_administrations.php
  3. 3
      chiffrer_options.php

41
auth/spip.php

@ -40,7 +40,7 @@ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) {
}
$md5pass = "";
$shapass = $shanext = "";
$shapass = $pass_hash_next = "";
if ($pass) {
$row = sql_fetsel("alea_actuel, alea_futur", "spip_auteurs", "login=" . sql_quote($login, $serveur, 'text'), '', '',
@ -48,29 +48,32 @@ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) {
if ($row) {
include_spip('auth/sha256.inc');
$pass_poivre = hash_hmac("sha256", $pass, $GLOBALS['cle_secrete']);
$pass_hash_next = password_hash($pass_poivre, PASSWORD_BCRYPT, ['salt' => $row['alea_futur']]);
$shapass = spip_sha256($row['alea_actuel'] . $pass);
$shanext = spip_sha256($row['alea_futur'] . $pass);
$md5pass = md5($row['alea_actuel'] . $pass);
}
}
// login inexistant ou mot de passe vide
if (!$shapass and !$md5pass) {
} else {
return array();
}
$row = sql_fetsel("*", "spip_auteurs",
"login=" . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'", '', '', '', '', $serveur);
include_spip("chiffrer_fonctions");
if ( $row["pass"] != $md5pass AND
dechiffrer($row["pass"]) != $md5pass AND
$row["pass"] != $shapass AND
dechiffrer($row["pass"]) != $shapass ){
switch ( strlen($row["pass"]) ) {
case 32:
if ($row["pass"] != $md5pass) unset($row);
break;
case 60:
if ( ! password_verify($pass_poivre, $row["pass"]) ) unset($row);
break;
case 64:
if ( $row["pass"] != $shapass ) unset($row);
break;
default:
unset($row);
}
// login/mot de passe incorrect
if (!$row) {
return array();
@ -78,15 +81,14 @@ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) {
// fait tourner le codage du pass dans la base
// sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
if ($shanext and !$phpauth) {
if ($pass_hash_next and !$phpauth) {
include_spip('inc/acces'); // pour creer_uniqid
@sql_update('spip_auteurs', array(
'alea_actuel' => 'alea_futur',
'pass' => sql_quote(chiffrer($shanext), $serveur, 'text'),
'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text')
), "id_auteur=" . $row['id_auteur'] . ' AND pass IN (' . sql_quote($shapass, $serveur,
'text') . ', ' . sql_quote($md5pass, $serveur, 'text') . ')', '', $serveur);
), "id_auteur=" . $row['id_auteur'], '', $serveur);
// En profiter pour verifier la securite de tmp/
// Si elle ne fonctionne pas a l'installation, prevenir
if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
@ -271,12 +273,13 @@ function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') {
$c = array();
include_spip('inc/acces');
include_spip('auth/sha256.inc');
include_spip("chiffrer_fonctions");
$htpass = generer_htpass($new_pass);
$alea_actuel = creer_uniqid();
$alea_futur = creer_uniqid();
$pass = chiffrer(spip_sha256($alea_actuel . $new_pass));
$pass_poivre = hash_hmac("sha256", $new_pass, $GLOBALS['cle_secrete']);
$pass = password_hash($pass_poivre, PASSWORD_BCRYPT, ['salt' => $alea_actuel]);
$c['pass'] = $pass;
$c['htpass'] = $htpass;
$c['alea_actuel'] = $alea_actuel;

13
chiffrer_administrations.php

@ -20,13 +20,6 @@ function chiffrement_installation(){
include_spip("chiffrer_fonctions");
initialiser_cle();
// pour * pass : chiffrer
$res = sql_allfetsel(array('id_auteur','pass'), 'spip_auteurs', "length(pass)<=64 AND statut='0minirezo'");
foreach ($res as $r){
$pass_chiffre = chiffrer($r["pass"]);
sql_update('spip_auteurs', array('pass' => sql_quote($pass_chiffre)), "id_auteur=" . $r['id_auteur']);
}
}
/**
@ -35,12 +28,6 @@ function chiffrement_installation(){
function chiffrement_desinstallation(){
include_spip("chiffrer_fonctions");
// pour * pass : dechiffrer
$res = sql_allfetsel(array('id_auteur','pass'), 'spip_auteurs', "length(pass)>64 AND statut='0minirezo'");
foreach ($res as $r){
$pass_dechiffre = dechiffrer($r["pass"]);
sql_update('spip_auteurs', array('pass' => sql_quote($pass_dechiffre)), "id_auteur=" . $r['id_auteur']);
}
supprimer_cle();
}

3
chiffrer_options.php

@ -1,3 +0,0 @@
<?php
$GLOBALS['cle_secrete'] = base64_decode('0Gm2Jlxf84zs+TBOlWUHPA==');
Loading…
Cancel
Save