2017-09-30 10 views
0

アム以下の私のデータの暗号化と復号化にクラスを使用して復号化するどのようにMicrosoft SQLデータベース内の暗号化データを格納し、それを取得し、それが

<?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; 
    } 

} 


?> 

私はデータを復号化し、保存せずに暗号化するためにクラスを使用します文字列は、これは出力 It is in the link

あるすべての長さ

<?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/>"; 



?> 

であるときに、データベースに、それがうまく機能

今、私は、ストアドプロシージャ

CREATE PROCEDURE [dbo].[spGetAge] 
    @Item_Name nvarchar(max) 
AS 
    SELECT Name AS IDName,Age FROM [User] WHERE Name = @Item_Name 
RETURN 0 

を使用して戻って、データベースからそれを取得したいときに成功しているこのコードのMSSQLデータベース

<?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)); 
     } 
?> 

が、その後、その後、これはPHPであることを保存するときそれ

<?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"; 


     } 



?> 

出力は In the link below

あるを取得するためのコード

この問題は、暗号化の入力文字列が14文字を超える場合にのみ発生します。私はそれをデータベースに保存してから解読しても、それを可能にして、それを完全に動作させることができます。助けをありがとう

+0

データを格納するデータベースフィールドのタイプと長さを確認します。なぜこれにストアドプロシージャを使用していますか? –

+0

@KIKOSoftware、私はnvarchar(max)を使用しました。私はそれが働くと思う。ストアドプロシージャを使用してSQLインジェクションを減らす –

+0

ストアドプロシージャはどのようにしてSQLインジェクションを減らすことができますか?私はそれに精通していない。私が知っていることは、バインディングパラメータがその仕事をするということです。 –

答えて

0

私はPHPの暗号化がとにかく行く間違った方法だと思う.. あなたはそこに必要なすべてのツールを持っているよりもSQLサーバーにあなたのデータを格納している場合。 thisの記事を投稿してください。 使用する暗号化のレイヤ数がわかったら、サーバー上に証明書とキーを作成します。 SQL Serverに関する情報を取得する場合は、mssqlサーバー上のコンポーネントを使用するストアドプロシージャを作成し、表示させる場合は、ストアドプロシージャを復号化する準備ができている必要があります。 mssqlサーバーで解読されなければ、読めるようにはなりません)。

関連する問題