在PHP加密資料

8 / 15, 2013 PHP , 網路 , 網路安全

大家有沒有想過把自己上載至伺服器的檔案加密呢?這聽起來好像很難,可是我現在就會教授一個方法把加密變得很容易啊。(其實就是利用了一個PHP不太常用的功能:Stream Filters,來實現的。)

好了,給大家看看基本的程式碼吧!(看到後你一定會說:那麼短?!)

<?php
// 加密的密碼
$passphrase = 'My secret';
// 把密碼變成一對可以重複製造
// 的初始向量和金鑰
$iv = substr(md5("\x1B\x3C\x58".$passphrase, true), 0, 8);
$key = substr(md5("\x2D\xFC\xD8".$passphrase, true) . md5("\x2D\xFC\xD9".$passphrase, true), 0, 24);
$opts = array('iv'=>$iv, 'key'=>$key);

// 開啟檔案
$fp = fopen('secret-file.enc', 'wb');

// 掛上MCrypt資料流過濾器
// 我們在這裏使用Triple DES加密
// 可是你可以使用其他加密方式,例如AES-256(rijndael-256)
stream_filter_append($fp, 'mcrypt.tripledes', STREAM_FILTER_WRITE, $opts);

// 把秘密資料寫入檔案
fwrite($fp, 'Secret secret secret data');

// 關閉檔案
fclose($fp);

現在試試開啟

secret-file.enc

,看看那些內容,是不是完全看不懂呢?因為在你使用

fwrite

的時候Mcrypt已經替你加密內容了。可是現在有一個問題:究竟怎樣解密呢?解密的過程也是很簡單的,一起看看程式碼吧!

<?php
// 解密用的密碼
$passphrase = 'My secret';

// 把密碼變成一對可以重複製造
// 的初始向量和金鑰
$iv = substr(md5("\x1B\x3C\x58".$passphrase, true), 0, 8);
$key = substr(md5("\x2D\xFC\xD8".$passphrase, true) . md5("\x2D\xFC\xD9".$passphrase, true), 0, 24);
$opts = array('iv'=>$iv, 'key'=>$key);

// 開啟檔案
$fp = fopen('secret-file.enc', 'rb');

// 掛上MCrypt資料流過濾器
// 我們在這裏使用Triple DES加密
// 可是你可以使用其他加密方式,例如AES-256(rijndael-256
stream_filter_append($fp, 'mdecrypt.tripledes', STREAM_FILTER_READ, $opts);

// 讀取資料
fpassthru($fp);

然後執行這個PHP檔案,就可以把秘密檔案解密了。注意:密碼必須要一致才可以正確解密內容。有了這些方法,你就可以把檔案上傳作加密了。

  • wangchifu

    你好,我全照您的程式…上傳檔案後,馬上進行加密…可是加密後的檔案內容並沒有「完全看不懂」,而是「Secret secret secret data」…server端有安裝php5-mcrypt….不知問題出在哪?謝謝您

    • Licson Lee

      不知道你的主機有沒有MCrypt Stream Filter支援呢?這個是需要的……

  • wangchifu

    最後檔案內容為「Secret secret secret data」??
    問題出在哪呢?

    • Licson Lee

      你是指加密後的檔案嗎?你可以給我一個可以重現文體的方法嗎?因為你提供的資訊實在太少了。