Am en utilisant la classe ci-dessous pour chiffrer et déchiffrer mes donnéesComment stocker des données cryptées dans la base de données Microsoft SQL et récupérer et décrypter
<?php
class ConnectionInfo
{
public $mServerName;
public $mConnectionInfo;
public $conn;
public function GetConnection()
{
# code...
$this->mServerName = "DESKTOP-ES2IEHB\SQLEXPRESS";
$this->mConnectionInfo = array("Database"=>"thefaithdb");
$this->conn = sqlsrv_connect($this->mServerName,$this->mConnectionInfo);
return $this->conn;
}
public function my_simple_crypt($string, $action = 'e',$algo) {
// you may change these values to your own
$secret_key = 'my_simple_secret_key';
$secret_iv = 'my_simple_secret_iv';
$output = false;
$encrypt_method = "AES-256-CBC";
$key = hash($algo, $secret_key);
$iv = substr(hash($algo, $secret_iv), 0, 16);
if($action == 'e') {
$output = base64_encode(openssl_encrypt($string, $encrypt_method, $key, 0, $iv));
}
else if($action == 'd'){
$output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
}
return $output;
}
}
?>
Quand j'utilise la classe pour décrypter les données et chiffrer sans stocker dans une base de données, il fonctionne bien lorsque la chaîne est de toute la longueur
<?php
require_once(dirname(__FILE__).'/Secure.php');
$mainpass = "ALSONG DUSTAN PHILANDER";
//MD5 encryption
$options = [
'cost' => 12,
];
$mSecure = new SecurityClass();
$encrypted = $mSecure->my_simple_crypt($mainpass, 'e','sha512');
$decrypted = $mSecure->my_simple_crypt($encrypted, 'd','sha512');
echo "encrypted $encrypted<br/>";
echo "decrypted $decrypted<br/>";
?>
Ceci est la sortie It is in the link
Maintenant, quand je stocke cette base de données MSSQL avec ce code
<?php
require_once(dirname(__FILE__).'/ConnectionInfo.php');
//Get up our connection
$mConnectionInfo = new ConnectionInfo();
$mConnectionInfo->GetConnection();
if ($mConnectionInfo->conn) {
# code...
echo "Connected<br/>";
}
$encrypted = $mConnectionInfo->my_simple_crypt('ALSONG DUSTAN PHILANDER' , 'e','sha384');
$myparams['Item_Name'] = $encrypted;
$encrypted2 = $mConnectionInfo->my_simple_crypt('56' , 'e','sha384');
$myparams['Item_Age'] = $encrypted2;
$parameters = array(array(&$myparams['Item_Name'],SQLSRV_PARAM_IN),
array(&$myparams['Item_Age'],SQLSRV_PARAM_IN));
$sql = "EXEC spGetUser @Item_Name = ? , @Item_Age = ? ";
$stmt = sqlsrv_prepare($mConnectionInfo->conn,$sql,$parameters);
$work = sqlsrv_execute($stmt);
if ($work) {
# code...
echo "Successful $encrypted<br/>";
}
else {
# code...
echo "Connection Failed.<br/>";
die(print_r(sqlsrv_errors(),true));
}
?>
Ce qui est Successfull, alors quand je veux le récupérer en arrière à partir de la base de données en utilisant une procédure stockée
CREATE PROCEDURE [dbo].[spGetAge]
@Item_Name nvarchar(max)
AS
SELECT Name AS IDName,Age FROM [User] WHERE Name = @Item_Name
RETURN 0
Alors c'est le php code pour le récupérer
<?php
require_once(dirname(__FILE__).'/ConnectionInfo.php');
//Get up our connection
$mConnectionInfo = new ConnectionInfo();
$mConnectionInfo->GetConnection();
if ($mConnectionInfo->conn) {
# code...
echo "Connected<br/>";
}
$encrypted1 = $mConnectionInfo->my_simple_crypt('ALSONG DUSTAN PHILANDER' , 'e','sha384');
$myparams2['Item_Name'] = $encrypted1;
$params = array(array(&$myparams2['Item_Name'],SQLSRV_PARAM_IN));
$sql2 = "EXEC spGetAge @Item_Name = ?";
$stmt2 = sqlsrv_prepare($mConnectionInfo->conn,$sql2,$params);
$work = sqlsrv_execute($stmt2);
if(!$stmt2)
{
echo "Query failed <br/>";
die(print_r(sqlsrv_errors(), true));
}
else{
$row = sqlsrv_fetch_array($stmt2,SQLSRV_FETCH_ASSOC);
$name = $row['IDName'];
if ($name==null) {
# code...
echo "Empty";
}
$decrypted = $mConnectionInfo->my_simple_crypt($row['IDName'], 'd','sha384');
$decrypted2 = $mConnectionInfo->my_simple_crypt($row['Age'], 'd','sha384');
echo "The age is $decrypted2 of $decrypted <br/>";
echo $row['IDName'] ;
echo "<br/> The name is $encrypted1";
}
?>
La sortie est In the link below
Ce problème survient uniquement lorsque ma chaîne d'entrée pour le chiffrement comporte plus de 14 caractères. Comment puis-je permettre de travailler aussi après que je l'ai stocké dans la base de données, puis décrypter et cela fonctionne parfaitement. Merci pour l'aide
Vérifiez le type et la longueur du champ de base de données dans lequel vous stockez les données. Pourquoi utilisez-vous une procédure stockée pour cela? –
@KIKOSoftware, j'ai utilisé nvarchar (max). Je pense que cela peut fonctionner. Et j'utilise la procédure stockée pour réduire les injections SQL –
De quelle manière une procédure stockée peut-elle réduire l'injection SQL? Je ne suis pas familier avec ça. Ce que je sais, c'est que les paramètres de liaison feront l'affaire. –