不可逆加密方式有 md5 與 crypt 兩種,Md5() 函數會將輸入的字串進行編碼會得到一個由 32 個文字組成的字串,由於演算過程嚴謹也不可逆是很常用的加密方式。
crypt() 函數可以支援STD DES (Data Encryption Standard)、EXT DES、MD5 (Message Digest Algorithm)、BLOWFISH、SHA256 (Secure Hash Algorithm)、SHA512 的方法再進行加密,crypt 函數有兩個參數,第一個是編碼的字串,第二次所挑選的加密方式。
語法:crypt(str,salt)
str:必需(規定要編碼的字符串)。
salt:可選(用於增加被編碼字符數目的字符串,以使編碼更加安全)。
註:crypt算法依賴於 salt 參數的格式和長度。
範例如下:
<?php
header("Content-Type:text/html; charset=utf-8");
$name="Chuan-Fu";
$md5=md5($name);
echo "MD5加密:".$md5."<br />";
if (CRYPT_STD_DES == 1)
echo "標準 DES-2: ".crypt($name,'12')."<br>"; // ./Aa0-Zz9 = 2 個字數
if (CRYPT_EXT_DES == 1)
echo "擴散 DES-9: ".crypt($name,'_33339999')."<br>"; // 底線開頭 _4+4字元 = 9 個字數
if (CRYPT_MD5 == 1)
echo "MD5: ".crypt($name,'$1.........n$')."<br>"; // $1$ 開頭
if (CRYPT_BLOWFISH == 1)
echo "Blowfish: ".crypt($name,'$2a.........n$')."<br>"; // $2a$ 開頭 (任一a/x/y), $ 結尾
if (CRYPT_SHA256 == 1)
echo "SHA-256: ".crypt($name,'$5.........n$')."<br>"; // $5 開頭, $ 結尾
if (CRYPT_SHA512 == 1)
echo "SHA-512: ".crypt($name,'$6.........n$'); // $6 開頭, $ 結尾
?>
可逆加密方式有 base64_encode 與 urlencode 兩種,base64_encode() 函數會將字串進行 MIME BASE64 編碼加密,其解密的函數為 base64_decode()。
urlencode() 函數可以可以將網址列上的字串進行編碼處理,除了 ".-_" 這3個字元外,其他字元都會被替換為%,空格編碼為 “+” 號,解密的函數為urldecode()。
可逆加密範例:
<?php
define("yourpwd","Chuan-Fu Chuang");
$base64encode=base64_encode(yourpwd);
echo 'base64_encode 加密後的結果為: '.$base64encode.'<br/>';
echo 'base64_decode 解密後的結果為: '.base64_decode($base64encode).'<hr>';
$urlencode=urlencode(yourpwd);
echo 'urlencode 加密後的結果為: '.$urlencode.'<br/>';
echo 'urldecode 解密後的結果為: '.urldecode($urlencode).'<hr>';
?>
rand() 函數可以產生隨機的整數,在 rand() 內可以定義最小值與最大值,於此範圍產生隨機的整數。如果沒有定義最小值與最大值時,將隨機產生1個 0 到某數之間的整數值,例如:rand ( 0 , 100 ); 。
在資料表中新增一筆帳密資料並加密
<?php
header("Content-Type:text/html; charset=utf-8");
$host = 'localhost'; $dbname = 'folder'; $user = 'root'; $password = 'admin';
try {
$conn = new PDO("mysql:host=$host; dbname=$dbname", $user, $password);
$conn->exec("SET CHARACTER SET utf8");
$account = "104481008"; $name = "Bless";
$password = "123456";
$key = (int)"202006201";
$myencrypt = enpwd($password,$key); // 自訂可逆與不可逆加密函數演算法 md5 & base64_encode
$sql = $conn->prepare("insert into user (account,password,name) values (:account,:password,:name)");
$sql->execute (array("account"=>$account,"name"=>$name,"password"=>$myencrypt));
echo "在user 資料表中新增一筆帳密資料成功<br/>";
$conn = null; // Disconnect
} catch(PDOException $e) { echo $e->getMessage(); }
// encrypt 加密
function enpwd($pwd, $key) {
$enkey = md5(rand(0, $key));
$per = 0; $str1 = '';
for($i = 0;$i < strlen($pwd); $i++) {
$per = $per == strlen($enkey) ? 0 : $per;
$str1 .= $enkey[$per].($pwd[$i] ^ $enkey[$per++]); }
return base64_encode(pwd_key($str1, $key)); }
// pwd key
function pwd_key($pwd, $enkey) {
$enkey = md5($enkey);
$per = 0; $str2 = '';
for($i = 0; $i < strlen($pwd); $i++) {
$per = $per == strlen($enkey) ? 0 : $per;
$str2 .= $pwd[$i] ^ $enkey[$per++]; }
return $str2; } ?>
<?php
header("Content-Type:text/html; charset=utf-8");
$mysqli = new mysqli('localhost','root','admin','folder');
$mysqli->query("SET CHARACTER SET utf8");
if ($mysqli->connect_error) { die('連結錯誤訊息: ' . $mysqli->connect_error."<br/>");}
$sql = "select * from user where account='104481008'";
$result = $mysqli->query($sql);
if ($result->num_rows > 0) {
$key = (int)"202006201";
while($row = $result->fetch_assoc()) { // fetch_assoc() 將讀出的資料Key值設定為該欄位的名稱。
echo "帳號:".$row["account"].", 使用者:".$row["name"].", 密碼:".$decrypt = depwd($row["password"],$key)."<br/>"; }
} else { echo "沒有這位使用者資料!"; }
$mysqli->close();
// decrypt 解密
function depwd($pwd, $key) {
$enkey = pwd_key(base64_decode($pwd), $key);
$str1 = '';
for($i = 0;$i < strlen($enkey)-1; $i++) {
$md5 = $enkey[$i];
$str1 .= $enkey[++$i] ^ $md5; }
return $str1; }
// pwd key
function pwd_key($enkey, $dekey) {
$dekey = md5($dekey);
$per = 0; $str2 = '';
for($i = 0; $i < strlen($enkey); $i++) {
$per = $per == strlen($dekey) ? 0 : $per;
$str2 .= $enkey[$i] ^ $dekey[$per++]; }
return $str2; }
?>