2017-09-30 1 views
0

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

+0

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? –

+0

@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 –

+0

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. –

Répondre

0

Je me sens comme le cryptage par php est la mauvaise façon d'aller de toute façon .. Si vous stockez vos données dans un serveur sql que vous avez tous les outils dont vous avez besoin. Donner this article un tir. Une fois que vous connaissez le nombre de couches de chiffrement que vous souhaitez utiliser, créez un certificat et des clés sur votre serveur. Si vous voulez obtenir les informations sur le serveur sql - écrire une procédure stockée qui utilise vos composants sur le serveur mssql et si vous voulez l'afficher, avoir une procédure stockée prête à les décrypter (ce que vous devriez avoir de toute façon parce que les données ne sera pas lisible s'il n'est pas décrypté sur le serveur mssql).