題主你可以使用 md5 或者 sha1 進(jìn)行初步處理,但為了更加安全,請你同時(shí)加上兩個(gè) salt,一個(gè)靜態(tài) salt,一個(gè)動態(tài)的 salt。以 md5 為例:
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)大峪免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
假設(shè)通過 POST 傳來的密碼為 $_POST['password'],在存入 DB 前先進(jìn)行如下的操作:
$password = hash('md5', $_POST['password'].$staticSalt.$dynamicSalt);
為了保證動態(tài) salt 的唯一性,可以這樣操作:
$dynamicSalt = hash('md5', microtime());
對于動態(tài)的 salt 可以與生成的密碼一起保存在 DB 中,而靜態(tài) salt 則可以直接放在類文件中(例如定義為一個(gè)靜態(tài)屬性即可)。
首先謝謝題主采納了我的答案,但是我之前的回答并不是最佳答案,之所以有此加密的想法源于自己所讀的源碼可能比較老,所以并沒使用上較新版本的加密方法,例如 bcrypt等。
此外,第二點(diǎn),感謝評論中幾位前輩的提點(diǎn),已經(jīng)明白設(shè)置靜態(tài) salt 的意義并不大,生成一個(gè)較長的動態(tài) salt 已然可以解決問題。
LZ應(yīng)該采用加鹽HASH。
如何“腌制”密碼呢?
=_,=
正確的格式應(yīng)該是,用戶password+動態(tài)的salt
動態(tài)的salt不能像2L所說的,使用microtime,因?yàn)闀r(shí)間在某些情況下不夠隨機(jī),而且是可能被猜解的。
這里推薦一個(gè)我用的加鹽HASH
$salt=base64_encode(mcrypt_create_iv(32,MCRYPT_DEV_RANDOM));
$password=sha1($register_password.$salt);
解釋:
首先使用mcrypt,產(chǎn)生電腦隨機(jī)生成的,專門用戶加密的隨機(jī)數(shù)函數(shù)。
第二步,把得到的隨機(jī)數(shù)通過base64加密,使其變長并且不利于猜解。
第三步,把得出的鹽拼接到密碼的后面,再對其使用sha1進(jìn)行哈希
再把password存入到用戶的數(shù)據(jù)庫。
PS:為何不用靜態(tài)的salt?沒有必要,使用一個(gè)動態(tài)隨機(jī)足夠長的鹽足矣。
為何不用MD5?因?yàn)殚L度不夠。
為何沒有使用多次HASH?因?yàn)檫@樣反而容易發(fā)生碰撞。
HASH好之后怎么使用“腌制”好的密碼?
用戶注冊-提交密碼-產(chǎn)生salt-腌制好的密碼存入數(shù)據(jù)庫-salt存入數(shù)據(jù)庫。
用戶登錄-提交密碼-調(diào)用salt接到提交密碼的后面-進(jìn)行HASH-調(diào)用之前注冊腌制好的密碼-對比HASH值是否和這個(gè)密碼相同
PHP中的加密方式有如下幾種
1. MD5加密
string md5 ( string $str [, bool $raw_output = false ] )
參數(shù)
str -- 原始字符串。
raw_output -- 如果可選的 raw_output 被設(shè)置為 TRUE,那么 MD5 報(bào)文摘要將以16字節(jié)長度的原始二進(jìn)制格式返回。
這是一種不可逆加密,執(zhí)行如下的代碼
$password = ‘123456‘;
echo md5($password);
得到結(jié)果是e10adc3949ba59abbe56e057f20f883e
2. Crype加密
string crypt ( string $str [, string $salt ] )
crypt() 返回一個(gè)基于標(biāo)準(zhǔn) UNIX DES 算法或系統(tǒng)上其他可用的替代算法的散列字符串。
參數(shù)
str -- 待散列的字符串。
salt -- 可選的鹽值字符串。如果沒有提供,算法行為將由不同的算法實(shí)現(xiàn)決定,并可能導(dǎo)致不可預(yù)料的結(jié)束。
這是也一種不可逆加密,執(zhí)行如下的代碼
代碼如下:
$password = ‘123456‘;
$salt = "test";// 只取前兩個(gè)
echo crypt($password, $salt);
得到的結(jié)果是teMGKvBPcptKo
使用自動鹽值的例子如下:
代碼如下:
$password = crypt(‘mypassword‘); // 自動生成鹽值
/* 你應(yīng)當(dāng)使用 crypt() 得到的完整結(jié)果作為鹽值進(jìn)行密碼校驗(yàn),以此來避免使用不同散列算法導(dǎo)致的問題。(如上所述,基于標(biāo)準(zhǔn) DES 算法的密碼散列使用 2 字符鹽值,但是基于 MD5 算法的散列使用 12 個(gè)字符鹽值。)*/
if (crypt(‘mypassword‘, $password) == $password) {
echo "Password verified!";
}
執(zhí)行結(jié)果是輸出 Password verified!
以不同散列類型使用 crypt()的例子如下:
代碼如下:
if (CRYPT_STD_DES == 1) {
echo ‘Standard DES: ‘ . crypt(‘rasmuslerdorf‘, ‘rl‘) . "\n";
}
if (CRYPT_EXT_DES == 1) {
echo ‘Extended DES: ‘ . crypt(‘rasmuslerdorf‘, ‘_J9..rasm‘) . "\n";
}
if (CRYPT_MD5 == 1) {
echo ‘MD5: ‘ . crypt(‘rasmuslerdorf‘, ‘$1$rasmusle$‘) . "\n";
}
if (CRYPT_BLOWFISH == 1) {
echo ‘Blowfish: ‘ . crypt(‘rasmuslerdorf‘, ‘$2a$07$usesomesillystringforsalt$‘) . "\n";
}
if (CRYPT_SHA256 == 1) {
echo ‘SHA-256: ‘ . crypt(‘rasmuslerdorf‘, ‘$5$rounds=5000$usesomesillystringforsalt$‘) . "\n";
}
if (CRYPT_SHA512 == 1) {
echo ‘SHA-512: ‘ . crypt(‘rasmuslerdorf‘, ‘$6$rounds=5000$usesomesillystringforsalt$‘) . "\n";
}
其結(jié)果如下
Standard DES: rl.3StKT.4T8M
Extended DES: _J9..rasmBYk8r9AiWNc
MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
在 crypt() 函數(shù)支持多重散列的系統(tǒng)上,下面的常量根據(jù)相應(yīng)的類型是否可用被設(shè)置為 0 或 1:
CRYPT_STD_DES - 基于標(biāo)準(zhǔn) DES 算法的散列使用 "./0-9A-Za-z" 字符中的兩個(gè)字符作為鹽值。在鹽值中使用非法的字符將導(dǎo)致 crypt() 失敗。
CRYPT_EXT_DES - 擴(kuò)展的基于 DES 算法的散列。其鹽值為 9 個(gè)字符的字符串,由 1 個(gè)下劃線后面跟著 4 字節(jié)循環(huán)次數(shù)和 4 字節(jié)鹽值組成。它們被編碼成可打印字符,每個(gè)字符 6 位,有效位最少的優(yōu)先。0 到 63 被編碼為 "./0-9A-Za-z"。在鹽值中使用非法的字符將導(dǎo)致 crypt() 失敗。
CRYPT_MD5 - MD5 散列使用一個(gè)以 $1$ 開始的 12 字符的字符串鹽值。
CRYPT_BLOWFISH - Blowfish 算法使用如下鹽值:“$2a$”,一個(gè)兩位 cost 參數(shù),“$” 以及 64 位由 “./0-9A-Za-z” 中的字符組合而成的字符串。在鹽值中使用此范圍之外的字符將導(dǎo)致 crypt() 返回一個(gè)空字符串。兩位 cost 參數(shù)是循環(huán)次數(shù)以 2 為底的對數(shù),它的范圍是 04-31,超出這個(gè)范圍將導(dǎo)致 crypt() 失敗。
CRYPT_SHA256 - SHA-256 算法使用一個(gè)以 $5$ 開頭的 16 字符字符串鹽值進(jìn)行散列。如果鹽值字符串以 “rounds=$” 開頭,N 的數(shù)字值將被用來指定散列循環(huán)的執(zhí)行次數(shù),這點(diǎn)很像 Blowfish 算法的 cost 參數(shù)。默認(rèn)的循環(huán)次數(shù)是 5000,最小是 1000,最大是 999,999,999。超出這個(gè)范圍的 N 將會被轉(zhuǎn)換為最接近的值。
CRYPT_SHA512 - SHA-512 算法使用一個(gè)以 $6$ 開頭的 16 字符字符串鹽值進(jìn)行散列。如果鹽值字符串以 “rounds=$” 開頭,N 的數(shù)字值將被用來指定散列循環(huán)的執(zhí)行次數(shù),這點(diǎn)很像 Blowfish 算法的 cost 參數(shù)。默認(rèn)的循環(huán)次數(shù)是 5000,最小是 1000,最大是 999,999,999。超出這個(gè)范圍的 N 將會被轉(zhuǎn)換為最接近的值。
3. Sha1加密
string sha1 ( string $str [, bool $raw_output = false ] )
參數(shù)
str -- 輸入字符串。
raw_output -- 如果可選的 raw_output 參數(shù)被設(shè)置為 TRUE,那么 sha1 摘要將以 20 字符長度的原始格式返回,否則返回值是一個(gè) 40 字符長度的十六進(jìn)制數(shù)字。
這是也一種不可逆加密,執(zhí)行如下代碼:
$password = ‘123456‘;
echo sha1($password);
得到的結(jié)果是7c4a8d09ca3762af61e59520943dc26494f8941b
以上幾種雖然是不可逆加密,但是也可以根據(jù)查字典的方式去解密。如下的地址中就提供了可以將上面的加密結(jié)果解密出來的功能。
那大家是不是加了就算加了密,也沒用啊,其實(shí)不然,只要你的加密足夠復(fù)雜,被破解出的可能性就越小,比如用以上三種加密方式混合加密,之后我會推薦給大家一個(gè)php的加密庫。
4. URL加密
string urlencode ( string $str )
此函數(shù)便于將字符串編碼并將其用于 URL 的請求部分,同時(shí)它還便于將變量傳遞給下一頁。
返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(+)。此編碼與 WWW 表單 POST 數(shù)據(jù)的編碼方式是一樣的,同時(shí)與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣。由于歷史原因,此編碼在將空格編碼為加號(+)方面與 RFC1738 編碼不同。
string urldecode ( string $str )
解碼給出的已編碼字符串中的任何 %##。 加號(‘+‘)被解碼成一個(gè)空格字符。
這是一種可逆加密,urlencode方法用于加密,urldecode方法用于解密,執(zhí)行如下代碼:
$url = ‘‘;
$encodeUrl = urlencode($url);
echo $encodeUrl . "\n";// 如果是在網(wǎng)頁上展示的,就將\n修改為
echo urldecode($encodeUrl);
得到的結(jié)果如下
http%3A%2F%2F
基于RFC 3986的加密URL的方法如下:
代碼如下:
function myUrlEncode($string) {
$entities = array(‘%21‘, ‘%2A‘, ‘%27‘, ‘%28‘, ‘%29‘, ‘%3B‘, ‘%3A‘, ‘%40‘, ‘%26‘, ‘%3D‘, ‘%2B‘, ‘%24‘, ‘%2C‘, ‘%2F‘, ‘%3F‘, ‘%25‘, ‘%23‘, ‘%5B‘, ‘%5D‘);
$replacements = array(‘!‘, ‘*‘, "‘", "(", ")", ";", ":", "@", "", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
return str_replace($entities, $replacements, urlencode($string));
}
5. Base64信息編碼加密
string base64_encode ( string $data )
使用 base64 對 data 進(jìn)行編碼。
設(shè)計(jì)此種編碼是為了使二進(jìn)制數(shù)據(jù)可以通過非純 8-bit 的傳輸層傳輸,例如電子郵件的主體。
Base64-encoded 數(shù)據(jù)要比原始數(shù)據(jù)多占用 33% 左右的空間。
string base64_decode ( string $data [, bool $strict = false ] )
對 base64 編碼的 data 進(jìn)行解碼。
參數(shù)
data -- 編碼過的數(shù)據(jù)。
strict -- 如果輸入的數(shù)據(jù)超出了 base64 字母表,則返回 FALSE。
執(zhí)行如下代碼:
代碼如下:
$name = ‘CraryPrimitiveMan‘;
$encodeName = base64_encode($name);
echo $encodeName . "\n";
echo base64_decode($encodeName);
其結(jié)果如下
代碼如下:
Q3JhcnlQcmltaXRpdmVNYW4=
CraryPrimitiveMan
推薦phpass
經(jīng) phpass 0.3 測試,在存入數(shù)據(jù)庫之前進(jìn)行哈希保護(hù)用戶密碼的標(biāo)準(zhǔn)方式。 許多常用的哈希算法如 md5,甚至是 sha1 對于密碼存儲都是不安全的, 因?yàn)轳斂湍軌蚴褂媚切┧惴ㄝp而易舉地破解密碼。
對密碼進(jìn)行哈希最安全的方法是使用 bcrypt 算法。開源的 phpass 庫以一個(gè)易于使用的類來提供該功能。
代碼如下:
?php
// Include phpass 庫
require_once(‘phpass-03/PasswordHash.php‘)
// 初始化散列器為不可移植(這樣更安全)
$hasher = new PasswordHash(8, false);
// 計(jì)算密碼的哈希值。$hashedPassword 是一個(gè)長度為 60 個(gè)字符的字符串.
$hashedPassword = $hasher-HashPassword(‘my super cool password‘);
// 你現(xiàn)在可以安全地將 $hashedPassword 保存到數(shù)據(jù)庫中!
// 通過比較用戶輸入內(nèi)容(產(chǎn)生的哈希值)和我們之前計(jì)算出的哈希值,來判斷用戶是否輸入了正確的密碼
$hasher-CheckPassword(‘the wrong password‘, $hashedPassword); // false
$hasher-CheckPassword(‘my super cool password‘, $hashedPassword); // true
?
php將密碼存入數(shù)據(jù)庫,可以分內(nèi)常見的4種方式:
1、直接md5加密存到到數(shù)據(jù)庫
2、md5兩次存到數(shù)據(jù)庫
3、對需要加密的字符串和一個(gè)常量 進(jìn)行混淆加密
4、生成一個(gè)隨機(jī)的變量存到數(shù)據(jù)庫中,然后對需要加密的字符串和這個(gè)隨機(jī)變量加密
?php$str="admin"; //需要加密的字符串$str2="php"; //增加一個(gè)常量混淆 $pass1=md5($str);$pass2=md5(md5($str));$pass3=md5($str.$str2);echo $pass1."br".$pass2."br".$pass3;?
輸出:
第四種
$str="admin"; //需要加密的字符串$encrypt=$row['encrypt']; // 生成的 隨機(jī)加密字符串 存到數(shù)據(jù)庫中$pass4=md5($str.$encrypt);// 8db2ec7e9636f124e56f7eb4d7b7cc7e
可以使用超級加密3000這款軟件試一下,操作比較簡單,加密后的數(shù)據(jù)安全性也比較高
1、下載安裝超級加密3000這款軟件
2、在需要加密的文件上面右鍵單擊,選擇“超級加密”
3.然后在彈出的密碼輸入窗口中輸入需要設(shè)置的密碼,然后點(diǎn)擊“確定”
這樣的話,一個(gè)文件就加密完成了,如果需要對文件夾進(jìn)行加密的話,加密方法也是一樣的哦
如果是不需要可逆的加密,可以用md5(標(biāo)準(zhǔn)密鑰長度128位)、sha1(標(biāo)準(zhǔn)密鑰長度160位)、md4、CRC-32。這個(gè)函數(shù)是將字符串變成32個(gè)長度的不重復(fù)的亂碼,多用于存儲用戶密碼。
如果需要可逆的加密,可以使用base64函數(shù),但是容易被人反過來看到原文。復(fù)雜一點(diǎn)可以用openssl拓展生成密鑰,利用手中的密鑰生成。
名稱欄目:php怎么給數(shù)據(jù)加密 php數(shù)據(jù)加密傳輸
轉(zhuǎn)載來源:http://jinyejixie.com/article24/hpceje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、云服務(wù)器、自適應(yīng)網(wǎng)站、移動網(wǎng)站建設(shè)、Google、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)