2011-06-20 79 views
0

我有一個使用mcrypt加密的php文件,現在我們需要解密它。使用eval讀取加密文件

這裏是解密:

abstract class Encryption_Abstract { 
    const CYPHER = 'blowfish'; 
    const MODE = 'cfb'; 
    protected $key; 
    public 
    function __construct($key) { 
     $this->key = $key; 
    } 
    public function encrypt($plaintext) { 
     return $plaintext; 
    } 
    public function decrypt($crypttext) { 
     return $crypttext; 
    } 
} 
//decryptor 
class Decryption extends Encryption_Abstract { 
    function decrypt($crypttext) { 
     $plaintext = ''; 
     $td = mcrypt_module_open(self::CYPHER, '', self::MODE, ''); 
     $ivsize = mcrypt_enc_get_iv_size($td); 
     $iv = substr($crypttext, 0, $ivsize); 
     $crypttext = substr($crypttext, $ivsize); 
     if ($iv) { 
      mcrypt_generic_init($td, $this - > key, $iv); 
      $plaintext = mdecrypt_generic($td, $crypttext); 
     } 
     return $plaintext; 
    } 
} 

現在,這是我們如何實例化,然後使用它:

$enc = new Decryption(KEYS::PROD); //KEYS::PROD is the decryption key 
eval($enc->decrypt(file_get_contents("key_file.txt"))); //<-- 

有什麼辦法來使用eval?還是我唯一的選擇?

回答

4

如果這是一個PHP文件,你需要執行它,你可以管它到一個php cli ..但它會是一樣的。但你怎麼會想執行一個PHP文件,但不執行:)

+0

@Gabi,所以在最後,我將不得不使用'eval()'? – Neal

+0

@你不需要_,但其他解決方案也有類似的安全問題。 –

+0

@Gabi,如果我們加密文件真的不應該是一個問題?我們做這件事的唯一原因就是我們的客戶無法擺弄它 – Neal

1

你可以存儲解密的內容在臨時文件,包括它和之後刪除?

$contents = $enc->decrypt(file_get_contents("key_file.txt")); 

$tmpFile = tempnam('/tmp', 'decrypted.'); 
file_put_contents($tmpFile, $contents); 

include $tmpFile; 

unlink($tmpFile); 
+0

問題是,他們可以看到加密文件包含哪些內容(我們並不真正需要) – Neal

+0

@Neal無論如何,父腳本包含解密文件所需的方法(鍵+算法),所以你基本上沒有任何安全問題。 –

+0

@MarcB該代碼所在的文件被混淆了(客戶端根本無法讀取它) – Neal