php16位加密
Zend Guard是目前市面上最成熟的PHP源碼加密產品。
經過本人搜集資料,親身測試後,總結了如何利用Zend Guard對PHP文件進行加密,以及如何利用Zend Loader對加密後的PHP文件進行解密。
我使用的是Wampserver2.2,其中php的版本是5.3.10。(注意:這個裡面自帶的php版本屬於TS版本,即Thread safety線程安全)
Zend Guard的安裝及破解
點擊下載 Zend Guard5.5.0,下載完成後,請自行傻瓜式安裝。
破解需要注意以下幾點:
1、本KEY的有效時間為2010年7月10號,因此激活時,請將自己電腦的系統時間調整到這個時間之前,如:2009-01-01
2、本KEY激活的為試用版,加密過的文件只有14天有效時間,因此在加密文件時,請將自己電腦的系統時間向後調整幾年,如:2020-01-01
3、點擊下載授權文件 zend_guard授權文件.zip,解壓得到zend_guard.zl,即激活用的文件
4、打開Zend Guard 5.5.0,[Help] -> [Register] -> [Search for a license file on my disk],選擇zend_guard.zl授權文件激活即可
如何使用Zend Guard進行加密?
1、打開Zend Guard 5.5.0,[File]->[New]->[Zend Guard Project],新建項目。
彈出如下的對話框:
2、點擊 Next ,下一步。彈出如下對話框,選擇要進行加密的源文件或文件夾。
本步驟是選擇要加密的文件,可以是單個文件[Add File]或整個文件夾[Add Folder],然後[Next]。
(此處,我選擇的是對整個文件夾進行加密。即 D:\wamp\www\demo 里的所有文件進行加密。)
3、接下來是選擇PHP的版本[與你web伺服器上PHP的版本相對照],這里很重要,版本不對會出錯,[Finish]完成項目的創建。
注意: 對於Zend Guard 5.5.0這個版本的加密軟體,最高只可支持5.3版本的PHP。如果您的PHP版本較高,請到Zend Guard官網下載對應的高版本加密軟體。
(由於,我的PHP版本是PHP 5.3.10,故這里我選擇PHP 5.3,其他地方可以默認,直接點擊完成)
4、在Zend Guard左側的Guard Explorer中,可以看到你新建的項目了,滑鼠選中項目名稱後,右鍵單擊[Encode Project],完成。
如此,就實現了對PHP源碼的最簡單的加密。
我們可以在產品的輸出目錄(D:\proctDir)里,看到加密後的文件。
可以看出,產品輸出目錄里的PHP文件已被加密了。
這種最簡單的加密方式,我們並沒有設置加密的有效期,也沒有設置許可證支持(即解密時,是否需要許可證文件),默認是永不過期,不需要解密許可文件。
如果要設置解密時的許可證文件,可以點擊 項目名稱(project_test) ,再點擊 項目主窗口中的 Overview 旁邊的 Security 選項卡,就可以進行更加安全的加密設置了。 如下圖:
Zend Loader 解密
上面我們已經對PHP代碼進行了最簡單的加密(編碼),加密後生成的PHP源代碼,就不能再被web伺服器上的PHP模塊解析了。
當我們將加密後的php文件放到web伺服器上執行時,會顯示如下信息:
Zend Guard Run-time support missing!
One more more files on this web site were encoded by ZendGuard and the required run-time support is not installed orproperly configured.
......
原來,加密後的php代碼需要ZendGuardLoader模塊才能正常運行。
因為我的php版本是5.3.10的,所以我這里只提供了ZendGuardLoader-php-5.3-Windows,如果是其他版本的php,請自行網路。
點擊下載 ZendGuardLoader-php-5.3-Windows
下載後,解壓壓縮包,找到目錄里的 ZendLoader.dll 文件,將它復制到你的php目錄里的ext目錄(PHP的擴展庫目錄)下,再編輯PHP的配置文件php.ini,添加如下代碼:
[Zend.loader],
zend_loader.enable=1
zend_loader.disable_licensing=1
zend_loader.obfuscation_level_support=3
zend_loader.license_path=
zend_extension="d:\wamp\bin\php\php5.3.10\ext\ZendLoader.dll"
註:
zend_loader.enable 表示是否啟用zend loader,1表示啟用,0表示禁用
zend_loader.disable_licensing 表示是否禁用許可證,1表示禁用,0表示不禁用 (由於上面我加密php文件的時候,沒有設置許可證支持,故解密時,禁用許可證)
zend_loader.obfuscation_level_support 表示代碼混淆級別
zend_loader.license_path 指定許可證文件的路徑
zend_extension 指定zend loader 擴展文件 的路徑
配置完成後,重啟wampserver,如果您的php的版本是NTS(非線程安全的話),就可以正常執行加密後的PHP文件了。
但是,多數情況下的php版本都是TS(線程安全)的,比如,我這個wampserver集成環境中的php是php-5.3.10-ts,它是沒有辦法支持Zend Guard Loader擴展文件的。故還會報出上面的錯誤提示信息。
因為,Zend Guard Loader 只能支持 NTS版本的php,終極解決辦法是下載安裝 NTS 版本的php。
為了實現PHP源文件的 Zend 解密測試,可以下載安裝 php-5.3.29-nts-Win32-VC9-x86,再來配置 Zend Loader 擴展支持。
如何查看安裝好的PHP的版本及PHP是否已經成功支持Zend Loader?
通過查看 phpinfo() 函數的輸出信息,利用 Ctrl + F 快速查找關鍵字Thread Safety 和 Zend Guard Loader。
如本人安裝好php-5.3.29-nts版本的php後,phpinfo()的輸出信息如下:
可以看到,Thread Safety 對應的值為disabled,就說明該php的版本是 NTS (非線程安全)的,否則就是TS版本的。
輸出信息中,還可以看到 Zend Guard Loader v3.3 字樣,說明 Zend Guard Loader 也安裝成功了。
再往下面看,還可以查看 Zend Guard Loader 的配置信息,如下:
到此,整個 Zend Guard 加密和 Zend Guard Loader 解密,就介紹完畢了。
溫馨提示: 為了順利實現PHP代碼的zend加密和解密,建議使用PHP官網上主流的PHP的NTS版和Zend官網上對應的Zend Guard加密軟體、 Zend Guard Loader解密插件。
相關附件:
Wampserver2.2
Zend
Guard5.5.0
php-5.3.29-nts-Win32-VC9-x86
mod_fcgid-2.3.6-win32-x86.zip
⑵ php純數字加密為可逆的定長密文
你這不是md5加密嗎,sql直接寫就行了。
你在資料庫工具中執行一下,select md5(1);
或者php的md5函數
echo md5(1);
php自帶可逆的加密是base64_encode和base64_decode,但是這個不是等長的,根據輸入的內容變換長度。估計這個不適合你。
你還是網路」php加密解密「吧,有現成的函數。
⑶ PHP中兩次MD5加密一個16位另一個32位這是為什麼
沒什麼不可能,PHP 默認的 MP5 就是 32位的。。
按樓主說的。我估計是設置了 MD5 函數的第二個參數了。。
echo md5("abc", true);
echo md5("abc", false);
或者寫成 0 和 1 效果是一樣的。以上代碼一個產生16位,一個32位。
⑷ PHP md5加密後進入截取16位,會出現相同密文嗎求答案
@mark35 說得對, 碰撞肯定會有的.
md5的密文離散度做得很好. 碰撞的概率並不高.
但如果你只截取16位的話, 碰撞的概率很高! 我曾經做過的實驗,大概在 百萬分之幾.
⑸ [PHP]關於mcrypt加密方法的參數
首先糾正一個問題,128不是說你的key要128個字元,128隻是說加密後的密文是128位,也就是16個位元組(1個位元組是8位, 16 * 8 = 128);
加密對key沒有強制要求,當你是null的時候,也是可以的,null只是我們人為約定不表示任何內容,內容為空,但是作為計算機存儲,也是用二進製表示的;
Key用於和給定的密文進行計算,從而得到結果。加密中用的key就相當於鑰匙,你加密後,如果需要解密,就必須提供鑰匙。在非對稱加密中,存在兩個不同的key,非對稱加密通常用於證書簽名,我們通常說的公鑰和私鑰,其實就是這里的key,用公鑰加密,就需要用私鑰解密,用私鑰加密,就需要用公鑰解密;對稱加密就只有一個key,加密解密都需要塔,就像你上面這里這個方法。在對稱加密中,你需要保證key的安全,就像你不能把鑰匙隨便給人一樣。
iv,我們通常成為初始化向量,但是用英語的話更容易明白,即:initial value,初始值,我們在加密的時候需要一個初始值,主要是為了加密結果更隨機。
如果你想了解更多的話,可能就需要專門了解加密的相關內容了。
推薦你看下下面的內容:
http://www.ciphersbyritter.com/GLOSSARY.HTM
⑹ php代碼怎麼加密最好,不能破解的那種
在使用PHP開發Web應用的中,很多的應用都會要求用戶注冊,而注冊的時候就需要我們對用戶的信息進行處理了,最常見的莫過於就是郵箱和密碼了,本文意在討論對密碼的處理:也就是對密碼的加密處理。
MD5
相信很多PHP開發者在最先接觸PHP的時候,處理密碼的首選加密函數可能就是MD5了,我當時就是這樣的:
$password = md5($_POST["password"]);
上面這段代碼是不是很熟悉?然而MD5的加密方式目前在PHP的江湖中貌似不太受歡迎了,因為它的加密演算法實在是顯得有點簡單了,而且很多破解密碼的站點都存放了很多經過MD5加密的密碼字元串,所以這里我是非常不提倡還在單單使用MD5來加密用戶的密碼的。
SHA256 和 SHA512
其實跟前面的MD5同期的還有一個SHA1加密方式的,不過也是演算法比較簡單,所以這里就一筆帶過吧。而這里即將要說到的SHA256 和 SHA512都是來自於SHA2家族的加密函數,看名字可能你就猜的出來了,這兩個加密方式分別生成256和512比特長度的hash字串。
他們的使用方法如下:
<?php
$password = hash("sha256", $password);
PHP內置了hash()函數,你只需要將加密方式傳給hash()函數就好了。你可以直接指明sha256, sha512, md5, sha1等加密方式。
鹽值
在加密的過程,我們還有一個非常常見的小夥伴:鹽值。對,我們在加密的時候其實會給加密的字元串添加一個額外的字元串,以達到提高一定安全的目的:
<?php
function generateHashWithSalt($password) {$intermediateSalt = md5(uniqid(rand(), true));$salt = substr($intermediateSalt, 0, 6);
return hash("sha256", $password . $salt);}
Bcrypt
如果讓我來建議一種加密方式的話,Bcrypt可能是我給你推薦的最低要求了,因為我會強烈推薦你後面會說到的Hashing API,不過Bcrypt也不失為一種比較不錯的加密方式了。
<?php
function generateHash($password) {
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {$salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);return crypt($password, $salt);
}
}
Bcrypt 其實就是Blowfish和crypt()函數的結合,我們這里通過CRYPT_BLOWFISH判斷Blowfish是否可用,然後像上面一樣生成一個鹽值,不過這里需要注意的是,crypt()的鹽值必須以$2a$或者$2y$開頭,詳細資料可以參考下面的鏈接:
http://www.php.net/security/crypt_blowfish.php更多資料可以看這里:
http://php.net/manual/en/function.crypt.phpPassword Hashing API
這里才是我們的重頭戲,Password Hashing API是PHP 5.5之後才有的新特性,它主要是提供下面幾個函數供我們使用:
password_hash() – 對密碼加密.
password_verify() – 驗證已經加密的密碼,檢驗其hash字串是否一致.
password_needs_rehash() – 給密碼重新加密.
password_get_info() – 返回加密演算法的名稱和一些相關信息.
雖然說crypt()函數在使用上已足夠,但是password_hash()不僅可以使我們的代碼更加簡短,而且還在安全方面給了我們更好的保障,所以,現在PHP的官方都是推薦這種方式來加密用戶的密碼,很多流行的框架比如Laravel就是用的這種加密方式。
<?php
$hash = password_hash($passwod, PASSWORD_DEFAULT);對,就是這么簡單,一行代碼,All done。
PASSWORD_DEFAULT目前使用的就是Bcrypt,所以在上面我會說推薦這個,不過因為Password Hashing API做得更好了,我必須鄭重地想你推薦Password Hashing API。這里需要注意的是,如果你代碼使用的都是PASSWORD_DEFAULT加密方式,那麼在資料庫的表中,password欄位就得設置超過60個字元長度,你也可以使用PASSWORD_BCRYPT,這個時候,加密後字串總是60個字元長度。
這里使用password_hash()你完全可以不提供鹽值(salt)和 消耗值 (cost),你可以將後者理解為一種性能的消耗值,cost越大,加密演算法越復雜,消耗的內存也就越大。當然,如果你需要指定對應的鹽值和消耗值,你可以這樣寫:
<?php
$options = [
'salt' => custom_function_for_salt(), //write your own code to generate a suitable salt'cost' => 12 // the default cost is 10
];
$hash = password_hash($password, PASSWORD_DEFAULT, $options);密碼加密過後,我們需要對密碼進行驗證,以此來判斷用戶輸入的密碼是否正確:
<?php
if (password_verify($password, $hash)) {
// Pass
}
else {
// Invalid
}
很簡單的吧,直接使用password_verify就可以對我們之前加密過的字元串(存在資料庫中)進行驗證了。
然而,如果有時候我們需要更改我們的加密方式,如某一天我們突然想更換一下鹽值或者提高一下消耗值,我們這時候就要使用到password_needs_rehash()函數了:
<?php
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) {// cost change to 12
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);// don't forget to store the new hash!
}
只有這樣,PHP的Password Hashing API才會知道我們重現更換了加密方式,這樣的主要目的就是為了後面的密碼驗證。
簡單地說一下password_get_info(),這個函數一般可以看到下面三個信息:
algo – 演算法實例
algoName – 演算法名字
options – 加密時候的可選參數
所以,現在就開始用PHP 5.5吧,別再糾結低版本了。
Happy Hacking
⑺ php md5下16位和32位的實現代碼
復制代碼
代碼如下:
<?php
echo substr(md5("admin"),8,16); // 16位MD5加密
echo "<hr>";
echo md5("admin"); // 32位MD5加密
?>
16位的MD5加密用substr函數截取了字元得到實現....
不想深入研究了 :) 要把腦力放到其他關鍵的地方~~
今天做了個php鏈接mssql資料庫,資料庫中的表中欄位使用MD5十六加密的。但是php中的MD5默認是32位,導致登錄程序沒辦法使用md5加密跟表中欄位匹配,在網上一搜也有不少人有這方面的困惑,後來找到一個解決辦法,是正確的,就記錄下來。
使用substr函數截取:
substr(md5("admin"),8,16);
//
16位MD5加密
md5("admin");
//
32位MD5加密
經過腳本之家測試結果如下:
我們以asp的幾個md5後的結果比較
附:如果遇到MD5加密文件,而又不知道的密碼的,請在資料庫中換上這組加密的數據。
admin---16位加密---7a57a5a743894a0e
admin---32位加密---
admin---40位加密---
substr(md5("admin"),8,16);
//
16位MD5加密
正是上面的32為從第8個字元開始的16個字元。所以大家不用考慮唯一性的問題。本身就是正確的。網上有人說php5支持
復制代碼
代碼如下:
echo
md5("admin",true);//返回16位,不過這是在PHP5里才有。
經測試輸出的結果是亂碼,如果大家有什麼好的代碼,可以分享下。
⑻ 誰能告訴我這個php是如何加密的嗎
演算法都給出了,這個就是簡單的查字典轉換為字元,下面舉例演示演算法過程:
最簡單的,假設itemid值為1,程序把它乘以16,然後取A-Za-z0-9+/這64個字元裡面對應的那個,那麼結果去是第16個,就是Q(從0開始數)
繼續幾個最簡單例子,itemid值為2、取32位,值是g,明白過來了沒有Z是25、a是27、...;再來一個itemid值為3、取48位、值為w
上面的特殊情況是乘積小於64,那麼結果就是一個字元。但是一般都不會這么簡單,如果乘積大於64的呢,程序代碼是按64取模的多位數字,例如itemid值為5,那麼乘積80,第一次取第16個字元、第二次取第1個字元,可以看成倒序的64進制數。
