Skip to content
Snippets Groups Projects
Commit 214b0083 authored by Louis GLEYO's avatar Louis GLEYO
Browse files

Exo 2

parents
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
db_connect : connexion à la BDD, la changer selon votre base de données locale
db_script : script à exécuter dans votre BDD pour créer les tabkes
pw_insert : toutes les fonctions d'insertion dans la base de donné selon les 5 modes de stockage de l'énoncé
pw_test : fonctions de test et lancement des tests automatiques
\ No newline at end of file
<?php
/*
* CONNEXION ET VERIFICATION DE LA CONNEXION A LA BDD
*/
$mysqli = new mysqli("localhost", "root", "", "securite");
/* Vérification de la connexion */
if (mysqli_connect_errno()) {
printf("Echec de la connexion : %s\n", mysqli_connect_error());
exit();
}
/* Retourne le nom de la base de données courante */
if ($result = $mysqli->query("SELECT DATABASE()")) {
$row = $result->fetch_row();
printf("La base de données courante est %s.\n", $row[0]);
$result->close();
}
\ No newline at end of file
# SCRIPT A EXECUTER POUR OBTENIR LA BDD NECESSAIRE AUX TESTS
CREATE TABLE USERS_CLEAR
(
identifiant VARCHAR(100) primary key,
mdp VARCHAR(100) not null
);
CREATE TABLE USERS_HASH
(
identifiant VARCHAR(100) primary key,
mdp VARCHAR(100) not null
);
CREATE TABLE USERS_STATIC_SALTING
(
identifiant VARCHAR(100) primary key,
mdp VARCHAR(100) not null
);
CREATE TABLE USERS_DYNAMIC_SALTING
(
identifiant VARCHAR(100) primary key,
mdp VARCHAR(100) not null
);
CREATE TABLE USERS_SYMETRICAL_ENCRYPTION
(
identifiant VARCHAR(100) primary key,
mdp VARCHAR(100) not null
);
\ No newline at end of file
<?php
require_once('db_connect.php');
/*
* DECLARATION DES FONCTIONS D'INSERTION ET DE RECUPERATION DE MOT DE PASSE
*/
/**
* Salt statique
*/
define("SALT","wattouatisacutepokemon");
/**
* Algorithme pour le hashage sans salt
*/
define("ALGO",'ripemd160');
/**
* Cipher pour le chiffrement symétrique
*/
define("CIPHER",'aes-128-ccm');
/**
* Tag pour le chiffrement symétrique
*/
define("TAG", base64_decode("OIAggQCGUbPgmPN6lFjQ8g=="));
/**
* Fonctions pour insérer un identfiant et un mot de passe dans la table appropriée
* @param $table_name : le nom de la table où insérer
* @param $id : l'identifiant
* @param $pw : le mot de passe (hashé/chiffré ou non)
*/
function insert($table_name,$id,$pw){
global $mysqli;
$stmt = $mysqli->prepare("INSERT INTO $table_name VALUES (?,?)");
$stmt->bind_param("ss",$id,$pw);
$stmt->execute();
$stmt->close();
}
/**
* Fonctions pour récupérer le mot de passé (hashé/encrypté ou non) d'un utilisateur dans la table demandée
* @param $table_name : le nom de la table où récupérer le mdp
* @param $id : l'identifiant de l'utilisateur
* @return mixed|string le mot de passe retrouvé ou une chaine par défaut si l'utilisateur n'existe pas dans la table
*/
function get_pw($table_name,$id){
global $mysqli;
$stmt = $mysqli->prepare("SELECT * FROM $table_name WHERE identifiant=?;");
$stmt->bind_param("s",$id);
$stmt->execute();
$resultat = $stmt->get_result();
$stmt->close();
if($data = $resultat->fetch_assoc()){
return $data['mdp'];
} else {
return "Non trouvé";
}
}
/**
* Insertion du mdp en clair
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
*/
function insert_clear($id,$pw){
insert('users_clear',$id,$pw);
}
/**
* Vérifie que le mot de passe dans la base de données claire est bien celui saisi de l'utilisateur
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @return bool true si les mots de passe correspondent, false sinon
*/
function check_clear($id,$pw){
return $pw == get_pw('users_clear',$id);
}
/**
* Insertion du mdp en hashé sans salt
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
*/
function insert_hash($id,$pw){
$encrypted_pw = hash(ALGO,$pw);
insert('users_hash',$id,$encrypted_pw);
}
/**
* Vérifie que le mot de passe dans la base de données pour les mdp hashés est bien celui saisi de l'utilisateur
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @return bool true si les mots de passe correspondent, false sinon
*/
function check_hash($id,$pw){
return hash(ALGO,$pw )==get_pw('users_hash',$id);
}
/**
* Insertion du mdp en hashé avec un salt statique
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
*/
function insert_static_salting($id,$pw){
$encrypted_pw = password_hash($pw,PASSWORD_DEFAULT,['salt'=>SALT]);
insert('users_static_salting',$id,$encrypted_pw);
}
/**
* Vérifie que le mot de passe dans la base de données pour les mdp salés statique est bien celui saisi de l'utilisateur
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @return bool true si les mots de passe correspondent, false sinon
*/
function check_static_salting($id,$pw){
return password_verify($pw,get_pw('users_static_salting',$id));
}
/**
* Insertion du mdp en hashé avec un salt dynamique
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
*/
function insert_dynamic_salting($id,$pw){
$encrypted_pw = password_hash($pw,PASSWORD_DEFAULT);
insert('users_dynamic_salting', $id, $encrypted_pw);
}
/**
* Vérifie que le mot de passe dans la base de données pour les mdp salés dynamique est bien celui saisi de l'utilisateur
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @return bool true si les mots de passe correspondent, false sinon
*/
function check_dynamic_salting($id,$pw){
return password_verify($pw,get_pw('users_dynamic_salting',$id));
}
/**
* Insertion du mdp en hashé avec un salt dynamique et chiffré symétriquement
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @param $key : clé symétrique de chiffrement
* @param $iv : vecteur d'initilialisation
*/
function insert_symetric_encryption($id,$pw,$key,$iv){
$TAG = TAG;
$ciphertext_raw= openssl_encrypt($pw,CIPHER,$key,OPENSSL_RAW_DATA,$iv, $TAG);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
$encrypted_pw = password_hash($ciphertext,PASSWORD_DEFAULT);
insert('users_symetrical_encryption', $id, $encrypted_pw);
}
/**
* Vérifie que le mot de passe dans la base de données pour les mdp salés dynamique chiffrés symétriquement est bien celui saisi de l'utilisateur
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @param $key : clé symétrique de chiffrement
* @param $iv : vecteur d'initilialisation
* @return bool true si les mots de passe correspondent, false sinon
*/
function check_symetric_encryption($id,$pw,$key,$iv){
$TAG = TAG;
$ciphertext_raw= openssl_encrypt($pw,CIPHER,$key,OPENSSL_RAW_DATA,$iv, $TAG);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
return password_verify($ciphertext,get_pw('users_symetrical_encryption',$id));
}
\ No newline at end of file
<?php
require_once('pw_insert.php');
/*
* TESTS AUTOMATIQUES DES FONCTIONS D'INSERTION DANS LA BDD
*/
/**
* Insère un utilisateur dans la table pour les mdp clairs, récupère le mot de passe inséré dans la table
* et vérifie s'ils correspondent
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @return bool true si les mdp correspondent, false sinon
*/
function test_clear($id, $pw)
{
insert_clear($id, $pw);
return check_clear($id, $pw);
}
/**
* Insère un utilisateur dans la table pour les mdp hashés, récupère le mot de passe inséré dans la table
* et vérifie s'ils correspondent
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @return bool true si les mdp correspondent, false sinon
*/
function test_hash($id, $pw)
{
insert_hash($id, $pw);
return check_hash($id, $pw);
}
/**
* Insère un utilisateur dans la table pour les mdp hashés salés statiques, récupère le mot de passe inséré dans la table
* et vérifie s'ils correspondent
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @return bool true si les mdp correspondent, false sinon
*/
function test_static_salting($id, $pw)
{
insert_static_salting($id, $pw);
return check_static_salting($id, $pw);
}
/**
* Insère un utilisateur dans la table pour les mdp hashés salés dynamiques, récupère le mot de passe inséré dans la table
* et vérifie s'ils correspondent
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @return bool true si les mdp correspondent, false sinon
*/
function test_dynamic_salting($id, $pw)
{
insert_dynamic_salting($id, $pw);
return check_dynamic_salting($id, $pw);
}
/**
* Insère un utilisateur dans la table pour les mdp hashés salés dynamiques et chiffré symétriquement,
* récupère le mot de passe inséré dans la table, et vérifie s'ils correspondent
* @param $id : identifiant de l'utilisateur
* @param $pw : mot de passe de l'utilisateur
* @param $key : clé de chiffrement
* @param $iv : vecteur d'initialisation
* @return bool true si les mdp correspondent, false sinon
*/
function test_symetric_encryption($id, $pw, $key, $iv)
{
insert_symetric_encryption($id, $pw, $key, $iv);
return check_symetric_encryption($id, $pw, $key, $iv);
}
/**
* Insère un utilisateur de toutes les manières possibles, renvoie une exception si le mot de passe est mal inséré
* dans une table
* @param $id : identifiant de l'utilisateur à insérer dans les tables
* @param $pw : mot de passe de l'utilisateur à insérer dans les tables
* @param $key : clé de chiffrement symétrique
* @param $iv : vecteur d'initialisation (pour le chiffrement symétrique)
* @throws ErrorException l'exception si un mot de passé n'est pas correctement hashé/encrypté
*/
function test_manuel($id, $pw, $key, $iv)
{
if (!test_clear($id, $pw)) {
throw new ErrorException('Erreur sur le mot de passe stocké en clair : ' . $pw);
}
if (!test_hash($id, $pw)) {
throw new ErrorException('Erreur sur le mot de passe stocké en hashage : ' . $pw);
}
if (!test_static_salting($id, $pw)) {
throw new ErrorException('Erreur sur le mot de passe stocké en hashage salé statique : ' . $pw);
}
if (!test_dynamic_salting($id, $pw)) {
throw new ErrorException('Erreur sur le mot de passe stocké en hashage salé dynamique : ' . $pw);
}
if (!test_symetric_encryption($id, $pw, $key, $iv)) {
throw new ErrorException('Erreur sur le mot de passe stocké en chiffrement symétrique : ' . $pw);
}
}
/**
* Effectue un test manuel pour des valeurs prédéfinies, imprime le message de l'exception s'il y en a une
* s'il n'y a pas d'exception, imprime que tout s'est bien passé.
*/
function test_auto()
{
$ivlen = openssl_cipher_iv_length(CIPHER);
$key = openssl_random_pseudo_bytes(18);
$iv = openssl_random_pseudo_bytes($ivlen);
try {
test_manuel("Riri", "Test1", $key, $iv);
test_manuel("Fifi", "Test2", $key, $iv);
test_manuel("Loulou", "Test3", $key, $iv);
} catch (ErrorException $exception) {
printf($exception->getMessage());
}
printf("Tous les tests se sont bien passés");
}
test_auto();
$mysqli->close();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment