PHP中的MD5加密
發(fā)布日期:2022-01-02 02:29 | 文章來源:gibhub
綜述:密碼學(xué)是研究編制密碼(我們簡稱為加密:encode)和破譯密碼(我們稱之為解密:decode)的技術(shù)科學(xué)。研究密碼變化的客觀規(guī)律,應(yīng)用于編制密碼以保守通信秘密的,稱為編碼學(xué);應(yīng)用于破譯密碼以獲取通信情報的,稱為破譯學(xué),總稱密碼學(xué)。通常情況下,人們將可懂的文本稱為明文;將明文變換成的不可懂的文本稱為密文。把明文變換成密文的過程叫加密;其逆過程,即把密文變換成明文的過程叫解密。
??PHP中提供了哪些數(shù)據(jù)加密功能?
??PHP提供了crypt()函數(shù)完成加密功能:
????string crypt (string input_string [, string salt])
??這一函數(shù)完成被稱作單向加密的功能,也就是說,它可以加密一些明碼,但不能夠?qū)⒚艽a轉(zhuǎn)換為原來的明碼。單向加密的口令一旦落入第三方人的手里,由于不能被還原為明文,因此也沒有什么大用處。在驗證用戶輸入的口令時,用戶的輸入采用的也是單向算法,如果輸入與存儲的經(jīng)加密后的口令相匹配,則輸入的口令一定是正確的。
??這個函數(shù)的input_string參數(shù)是需要加密的字符串,第二個參數(shù)salt是一個位字串,它能夠影響加密的暗碼,進一步地排除被稱作預(yù)計算攻擊的可能性。缺省情況下,PHP使用一個2個字符的DES干擾串,如果你的系統(tǒng)使用的是MD5 ,它會使用一個12個字符的干擾串。我們可以通過執(zhí)行下面的命令發(fā)現(xiàn)系統(tǒng)將要使用的干擾串的長度:
????print "系統(tǒng)使用的干擾串的長度是:". CRYPT_SALT_LENGTH;
??crypt()支持四種算法,下面是它支持的算法和相應(yīng)的salt參數(shù)的長度:
[注:以下用表格]
算法 Salt長度
CRYPT_STD_DES 2-character (默認)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$
??怎樣將PHP的數(shù)據(jù)加密功能應(yīng)用于用戶驗證?
??我們用crypt()實現(xiàn)用戶身份驗證。比如我們用一段PHP程序限制對一個目錄的訪問,只允許注冊用戶訪問這一目錄。我們把資料存儲MySQL數(shù)據(jù)庫的一個表(這個數(shù)據(jù)表名為members)中:
????mysql>CREATE TABLE members (
????->username CHAR(14) NOT NULL,
????->password CHAR(32) NOT NULL,
????->PRIMARY KEY(username)
????->);
??然后,我們可以輸入用戶的數(shù)據(jù)到該表中:
用戶名 密碼
Tom keloD1C377lKE
John ba1T7vnz9AWgk
Bill paLUvRWsRLZ4U
??這些加密的口令對應(yīng)的明碼分別是Tom、John和Bill。我們將根據(jù)口令的前二個字母創(chuàng)建干擾串:
????$enteredPassword.
????$salt = substr($enteredPassword, 0, 2);
????$userPswd = crypt($enteredPassword, $salt);
????// $userPswd然后就和用戶名一起存儲在MySQL 中
??crypt()和Apache的口令-應(yīng)答驗證系統(tǒng)的應(yīng)用
????<?php
????$host = "localhost"; //主機
????$username = "Tom"; //用戶名
????$passwd = "Hello world"; //密碼
????$db = "users"; //數(shù)據(jù)庫名
????// 設(shè)置是否通過驗證標(biāo)志,默認為否
????$authorization = 0;
????// 提示用戶輸入帳號和密碼
????if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)){
??????mysql_pconnect($host, $username, $passwd) or die("不能連接到MySQL服務(wù)器!");
??????mysql_select_db($db) or die("不能選擇數(shù)據(jù)庫!");
??????// 進行加密
??????$salt = substr($PHP_AUTH_PW, 0, 2);
??????$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
??????//SQL查詢語句
??????$query = "SELECT username FROM members WHERE username = \'$PHP_AUTH_USER\' AND password = \'$encrypted_pswd\'";
??????// 執(zhí)行查詢
??????if (mysql_numrows(mysql_query($query)) == 1) {
????????$authorization = 1;
??????}
????}
????if (! $authorization){
??????header(\'WWW-Authenticate: Basic realm="用戶驗證"\');
??????header(\'HTTP/1.0 401 Unauthorized\');
??????print "無法通過驗證";
??????exit;
????}else {
??????print "已經(jīng)加密";
????}
?????>
??在缺省狀態(tài)下使用的 crypt()并不是最安全的,所以如果需要較高的安全性能,就需要其他更好的算法,比如md5(),這一函數(shù)使用MD5散列算法。
??如何通過MD5方式進行加密?
??PHP中通過MD5方式加密的函數(shù)有md5(),它的一個作用是混編。
??一個混編函數(shù)可以將一個可變長度的信息變換為具有固定長度被混編過的輸出,也被稱作"信息文摘",這是十分有用的,因為 一個固定長度的字符串可以用來檢查文件的完整性和驗證數(shù)字簽名與用戶身份。PHP內(nèi)置的md5()混編函數(shù)將把一個可變長度的信息轉(zhuǎn)換為128位(32個字符)的信息文摘?;炀幍囊粋€有趣的特點是:不能通過分析混編后的信息得到原來的明碼,因為混編后的結(jié)果 與原來的明碼內(nèi)容沒有依賴關(guān)系。即便只改變一個字符串中的一個字符,也將使得MD5混編算法計算出二個截然不同的結(jié)果。我們首先來看下表的內(nèi)容及其相應(yīng)的結(jié)果:
??使用md5()混編字符串
????<php
????$input = "Hello,PHP world!";
????$output = md5($input);
????print "輸出: $output ";
?????>
??結(jié)果:
????輸出: 7996b5e0804042fd531907a4900f190e
??注意,結(jié)果的長度為32個字符。我們把$input的值稍微改變一下:
??使用md5()對一個稍微變化的字符串進行混編
????<?php
????$input = "Hello,PHP World!";
????$output = md5($input);
????print "輸出: $output ";
?????>
??結(jié)果:
????hash2: f0456d48ed06a5c35b1e42561fa7a016
??可以發(fā)現(xiàn),盡管二個結(jié)果的長度都是32個字符,但明文中一點微小的變化使得結(jié)果發(fā)生了很大的變化,我們可以利用這個特點來檢查數(shù)據(jù)中微小變化。
??PHP中提供了哪些數(shù)據(jù)加密功能?
??PHP提供了crypt()函數(shù)完成加密功能:
????string crypt (string input_string [, string salt])
??這一函數(shù)完成被稱作單向加密的功能,也就是說,它可以加密一些明碼,但不能夠?qū)⒚艽a轉(zhuǎn)換為原來的明碼。單向加密的口令一旦落入第三方人的手里,由于不能被還原為明文,因此也沒有什么大用處。在驗證用戶輸入的口令時,用戶的輸入采用的也是單向算法,如果輸入與存儲的經(jīng)加密后的口令相匹配,則輸入的口令一定是正確的。
??這個函數(shù)的input_string參數(shù)是需要加密的字符串,第二個參數(shù)salt是一個位字串,它能夠影響加密的暗碼,進一步地排除被稱作預(yù)計算攻擊的可能性。缺省情況下,PHP使用一個2個字符的DES干擾串,如果你的系統(tǒng)使用的是MD5 ,它會使用一個12個字符的干擾串。我們可以通過執(zhí)行下面的命令發(fā)現(xiàn)系統(tǒng)將要使用的干擾串的長度:
????print "系統(tǒng)使用的干擾串的長度是:". CRYPT_SALT_LENGTH;
??crypt()支持四種算法,下面是它支持的算法和相應(yīng)的salt參數(shù)的長度:
[注:以下用表格]
算法 Salt長度
CRYPT_STD_DES 2-character (默認)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$
??怎樣將PHP的數(shù)據(jù)加密功能應(yīng)用于用戶驗證?
??我們用crypt()實現(xiàn)用戶身份驗證。比如我們用一段PHP程序限制對一個目錄的訪問,只允許注冊用戶訪問這一目錄。我們把資料存儲MySQL數(shù)據(jù)庫的一個表(這個數(shù)據(jù)表名為members)中:
????mysql>CREATE TABLE members (
????->username CHAR(14) NOT NULL,
????->password CHAR(32) NOT NULL,
????->PRIMARY KEY(username)
????->);
??然后,我們可以輸入用戶的數(shù)據(jù)到該表中:
用戶名 密碼
Tom keloD1C377lKE
John ba1T7vnz9AWgk
Bill paLUvRWsRLZ4U
??這些加密的口令對應(yīng)的明碼分別是Tom、John和Bill。我們將根據(jù)口令的前二個字母創(chuàng)建干擾串:
????$enteredPassword.
????$salt = substr($enteredPassword, 0, 2);
????$userPswd = crypt($enteredPassword, $salt);
????// $userPswd然后就和用戶名一起存儲在MySQL 中
??crypt()和Apache的口令-應(yīng)答驗證系統(tǒng)的應(yīng)用
????<?php
????$host = "localhost"; //主機
????$username = "Tom"; //用戶名
????$passwd = "Hello world"; //密碼
????$db = "users"; //數(shù)據(jù)庫名
????// 設(shè)置是否通過驗證標(biāo)志,默認為否
????$authorization = 0;
????// 提示用戶輸入帳號和密碼
????if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)){
??????mysql_pconnect($host, $username, $passwd) or die("不能連接到MySQL服務(wù)器!");
??????mysql_select_db($db) or die("不能選擇數(shù)據(jù)庫!");
??????// 進行加密
??????$salt = substr($PHP_AUTH_PW, 0, 2);
??????$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
??????//SQL查詢語句
??????$query = "SELECT username FROM members WHERE username = \'$PHP_AUTH_USER\' AND password = \'$encrypted_pswd\'";
??????// 執(zhí)行查詢
??????if (mysql_numrows(mysql_query($query)) == 1) {
????????$authorization = 1;
??????}
????}
????if (! $authorization){
??????header(\'WWW-Authenticate: Basic realm="用戶驗證"\');
??????header(\'HTTP/1.0 401 Unauthorized\');
??????print "無法通過驗證";
??????exit;
????}else {
??????print "已經(jīng)加密";
????}
?????>
??在缺省狀態(tài)下使用的 crypt()并不是最安全的,所以如果需要較高的安全性能,就需要其他更好的算法,比如md5(),這一函數(shù)使用MD5散列算法。
??如何通過MD5方式進行加密?
??PHP中通過MD5方式加密的函數(shù)有md5(),它的一個作用是混編。
??一個混編函數(shù)可以將一個可變長度的信息變換為具有固定長度被混編過的輸出,也被稱作"信息文摘",這是十分有用的,因為 一個固定長度的字符串可以用來檢查文件的完整性和驗證數(shù)字簽名與用戶身份。PHP內(nèi)置的md5()混編函數(shù)將把一個可變長度的信息轉(zhuǎn)換為128位(32個字符)的信息文摘?;炀幍囊粋€有趣的特點是:不能通過分析混編后的信息得到原來的明碼,因為混編后的結(jié)果 與原來的明碼內(nèi)容沒有依賴關(guān)系。即便只改變一個字符串中的一個字符,也將使得MD5混編算法計算出二個截然不同的結(jié)果。我們首先來看下表的內(nèi)容及其相應(yīng)的結(jié)果:
??使用md5()混編字符串
????<php
????$input = "Hello,PHP world!";
????$output = md5($input);
????print "輸出: $output ";
?????>
??結(jié)果:
????輸出: 7996b5e0804042fd531907a4900f190e
??注意,結(jié)果的長度為32個字符。我們把$input的值稍微改變一下:
??使用md5()對一個稍微變化的字符串進行混編
????<?php
????$input = "Hello,PHP World!";
????$output = md5($input);
????print "輸出: $output ";
?????>
??結(jié)果:
????hash2: f0456d48ed06a5c35b1e42561fa7a016
??可以發(fā)現(xiàn),盡管二個結(jié)果的長度都是32個字符,但明文中一點微小的變化使得結(jié)果發(fā)生了很大的變化,我們可以利用這個特點來檢查數(shù)據(jù)中微小變化。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章