新聞中心
PHP如何對(duì)用戶密碼進(jìn)行加密
PHP如何對(duì)用戶密碼進(jìn)行加密
網(wǎng)站的建設(shè)創(chuàng)新互聯(lián)公司專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為崗?fù)?/a>等企業(yè)提供專業(yè)服務(wù)。
第一種方法:可以使用如下方法對(duì)用戶密碼進(jìn)行加密:MySqlSET user@”localhost” PASSWORD=PASSWORD(”Password”);
第二種方法:可以使用MYSQL的 PASSWORD函數(shù)進(jìn)行用戶密碼的加密。例如:Insert into user(password, ……..) values (PASSWORD(”$password”,………));
可以在一個(gè)PHP文件里面include另外一個(gè)PHP文件兩次嗎
是的,可以在一個(gè)PHP文件里面include另外一個(gè)PHP文件兩次,被include的那個(gè)php文件也會(huì)執(zhí)行兩次,所以如果在這個(gè)文件里面定義的有一個(gè)class, 就會(huì)報(bào)出the class already defined的錯(cuò)誤。
mysql的最長數(shù)據(jù)庫名,表名,字段名可以是多長
數(shù)據(jù)庫名字最長為64
數(shù)據(jù)表名字最長為64
字段名字最長為64
mysql_pconnect()和mysql_connect()有什么區(qū)別
兩者的區(qū)別主要有兩個(gè):
1. 在進(jìn)行數(shù)據(jù)庫連接時(shí),函數(shù)會(huì)先找同一個(gè)host, 用戶和密碼的persistent(持續(xù)的)的'鏈接,如果能找到,則使用這個(gè)鏈接而不返回一個(gè)新的鏈接。
2. mysql_pconnect()創(chuàng)建的數(shù)據(jù)庫連接在腳本執(zhí)行完畢后仍然保留,可以被后來的代碼繼續(xù)使用,mysql_close()函數(shù)也不會(huì)關(guān)閉mysql_pconnect()創(chuàng)建的鏈接。
;
PHPadmin創(chuàng)建數(shù)據(jù)庫如何密碼sha1加密?
可以查看數(shù)據(jù)庫用戶加密后的密碼
1. 打開phpmyadmin
2. ? ?左側(cè)主菜單選擇mysql庫,然后選擇user表
在user表里可以看到所用用戶加密后的密碼,見附圖
請(qǐng)PHP高手來解決,連接數(shù)據(jù)庫用戶登錄程序,。要求MD5密碼加密
mysql_query($db);
這是要干什么???把這句去掉;
$sql="select *from user where name=$username and password=$pws;"
改成
$sql="select * from user where name='".$username."' and password='".$pws."'";
1.*號(hào)后邊應(yīng)該有空格;
2.最后的分號(hào)應(yīng)該在引號(hào)外邊;
3.查詢語句中的字符串應(yīng)該加引號(hào);
試試看
另外提兩點(diǎn)建議:
1 $db=mysql_select_db("B");
寫成 $db=mysql_select_db("B",$link);
養(yǎng)成個(gè)好習(xí)慣,省得到用到多個(gè)數(shù)據(jù)庫時(shí)容易亂;
2.$_SESSION["name"]="2";//先將值定義為假//
定義為假的時(shí)候直接 $_SESSION["name"]="" 就好了,要不多亂啊。
3. if($row==1)
{
$_SESSION["name"]="1";
}
else $_SESSION["name"]="2";
前邊已經(jīng)定義完 $_SESSION["name"]="2 了 后邊這個(gè) else 就沒有必要寫了啊。
你應(yīng)該先定位是哪里錯(cuò)了啊,在每個(gè)數(shù)據(jù)庫操作語句后邊都加上, or die(mysql_error());
根據(jù)錯(cuò)誤提示看看錯(cuò)誤出在哪,看不懂的話把錯(cuò)誤提示語句一起發(fā)上來,效率會(huì)更高 呵呵。
你應(yīng)該先看看執(zhí)行的是那條語句,然后看看執(zhí)行這條語句的條件,這樣往前推,你的錯(cuò)誤也有可能在登錄頁面上,仔細(xì)找找多看幾遍代碼你一定能找到的。
php代碼怎么加密最好,不能破解的那種
在使用PHP開發(fā)Web應(yīng)用的中,很多的應(yīng)用都會(huì)要求用戶注冊(cè),而注冊(cè)的時(shí)候就需要我們對(duì)用戶的信息進(jìn)行處理了,最常見的莫過于就是郵箱和密碼了,本文意在討論對(duì)密碼的處理:也就是對(duì)密碼的加密處理。
MD5
相信很多PHP開發(fā)者在最先接觸PHP的時(shí)候,處理密碼的首選加密函數(shù)可能就是MD5了,我當(dāng)時(shí)就是這樣的:
$password = md5($_POST["password"]);
上面這段代碼是不是很熟悉?然而MD5的加密方式目前在PHP的江湖中貌似不太受歡迎了,因?yàn)樗募用芩惴▽?shí)在是顯得有點(diǎn)簡單了,而且很多破解密碼的站點(diǎn)都存放了很多經(jīng)過MD5加密的密碼字符串,所以這里我是非常不提倡還在單單使用MD5來加密用戶的密碼的。
SHA256 和 SHA512
其實(shí)跟前面的MD5同期的還有一個(gè)SHA1加密方式的,不過也是算法比較簡單,所以這里就一筆帶過吧。而這里即將要說到的SHA256 和 SHA512都是來自于SHA2家族的加密函數(shù),看名字可能你就猜的出來了,這兩個(gè)加密方式分別生成256和512比特長度的hash字串。
他們的使用方法如下:
?php
$password = hash("sha256", $password);
PHP內(nèi)置了hash()函數(shù),你只需要將加密方式傳給hash()函數(shù)就好了。你可以直接指明sha256, sha512, md5, sha1等加密方式。
鹽值
在加密的過程,我們還有一個(gè)非常常見的小伙伴:鹽值。對(duì),我們?cè)诩用艿臅r(shí)候其實(shí)會(huì)給加密的字符串添加一個(gè)額外的字符串,以達(dá)到提高一定安全的目的:
?php
function generateHashWithSalt($password) {$intermediateSalt = md5(uniqid(rand(), true));$salt = substr($intermediateSalt, 0, 6);
return hash("sha256", $password . $salt);}
Bcrypt
如果讓我來建議一種加密方式的話,Bcrypt可能是我給你推薦的最低要求了,因?yàn)槲視?huì)強(qiáng)烈推薦你后面會(huì)說到的Hashing API,不過Bcrypt也不失為一種比較不錯(cuò)的加密方式了。
?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 其實(shí)就是Blowfish和crypt()函數(shù)的結(jié)合,我們這里通過CRYPT_BLOWFISH判斷Blowfish是否可用,然后像上面一樣生成一個(gè)鹽值,不過這里需要注意的是,crypt()的鹽值必須以$2a$或者$2y$開頭,詳細(xì)資料可以參考下面的鏈接:
更多資料可以看這里:
Hashing API
這里才是我們的重頭戲,Password Hashing API是PHP 5.5之后才有的新特性,它主要是提供下面幾個(gè)函數(shù)供我們使用:
password_hash() – 對(duì)密碼加密.
password_verify() – 驗(yàn)證已經(jīng)加密的密碼,檢驗(yàn)其hash字串是否一致.
password_needs_rehash() – 給密碼重新加密.
password_get_info() – 返回加密算法的名稱和一些相關(guān)信息.
雖然說crypt()函數(shù)在使用上已足夠,但是password_hash()不僅可以使我們的代碼更加簡短,而且還在安全方面給了我們更好的保障,所以,現(xiàn)在PHP的官方都是推薦這種方式來加密用戶的密碼,很多流行的框架比如Laravel就是用的這種加密方式。
?php
$hash = password_hash($passwod, PASSWORD_DEFAULT);對(duì),就是這么簡單,一行代碼,All done。
PASSWORD_DEFAULT目前使用的就是Bcrypt,所以在上面我會(huì)說推薦這個(gè),不過因?yàn)镻assword Hashing API做得更好了,我必須鄭重地想你推薦Password Hashing API。這里需要注意的是,如果你代碼使用的都是PASSWORD_DEFAULT加密方式,那么在數(shù)據(jù)庫的表中,password字段就得設(shè)置超過60個(gè)字符長度,你也可以使用PASSWORD_BCRYPT,這個(gè)時(shí)候,加密后字串總是60個(gè)字符長度。
這里使用password_hash()你完全可以不提供鹽值(salt)和 消耗值 (cost),你可以將后者理解為一種性能的消耗值,cost越大,加密算法越復(fù)雜,消耗的內(nèi)存也就越大。當(dāng)然,如果你需要指定對(duì)應(yīng)的鹽值和消耗值,你可以這樣寫:
?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);密碼加密過后,我們需要對(duì)密碼進(jìn)行驗(yàn)證,以此來判斷用戶輸入的密碼是否正確:
?php
if (password_verify($password, $hash)) {
// Pass
}
else {
// Invalid
}
很簡單的吧,直接使用password_verify就可以對(duì)我們之前加密過的字符串(存在數(shù)據(jù)庫中)進(jìn)行驗(yàn)證了。
然而,如果有時(shí)候我們需要更改我們的加密方式,如某一天我們突然想更換一下鹽值或者提高一下消耗值,我們這時(shí)候就要使用到password_needs_rehash()函數(shù)了:
?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才會(huì)知道我們重現(xiàn)更換了加密方式,這樣的主要目的就是為了后面的密碼驗(yàn)證。
簡單地說一下password_get_info(),這個(gè)函數(shù)一般可以看到下面三個(gè)信息:
algo – 算法實(shí)例
algoName – 算法名字
options – 加密時(shí)候的可選參數(shù)
所以,現(xiàn)在就開始用PHP 5.5吧,別再糾結(jié)低版本了。
Happy Hacking
用php將密碼存入數(shù)據(jù)庫,用什么方法進(jìn)行加密?
題主你可以使用 md5 或者 sha1 進(jìn)行初步處理,但為了更加安全,請(qǐng)你同時(shí)加上兩個(gè) salt,一個(gè)靜態(tài) salt,一個(gè)動(dòng)態(tài)的 salt。以 md5 為例:
假設(shè)通過 POST 傳來的密碼為 $_POST['password'],在存入 DB 前先進(jìn)行如下的操作:
$password = hash('md5', $_POST['password'].$staticSalt.$dynamicSalt);
為了保證動(dòng)態(tài) salt 的唯一性,可以這樣操作:
$dynamicSalt = hash('md5', microtime());
對(duì)于動(dòng)態(tài)的 salt 可以與生成的密碼一起保存在 DB 中,而靜態(tài) salt 則可以直接放在類文件中(例如定義為一個(gè)靜態(tài)屬性即可)。
首先謝謝題主采納了我的答案,但是我之前的回答并不是最佳答案,之所以有此加密的想法源于自己所讀的源碼可能比較老,所以并沒使用上較新版本的加密方法,例如 bcrypt等。
此外,第二點(diǎn),感謝評(píng)論中幾位前輩的提點(diǎn),已經(jīng)明白設(shè)置靜態(tài) salt 的意義并不大,生成一個(gè)較長的動(dòng)態(tài) salt 已然可以解決問題。
LZ應(yīng)該采用加鹽HASH。
如何“腌制”密碼呢?
=_,=
正確的格式應(yīng)該是,用戶password+動(dòng)態(tài)的salt
動(dòng)態(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加密,使其變長并且不利于猜解。
第三步,把得出的鹽拼接到密碼的后面,再對(duì)其使用sha1進(jìn)行哈希
再把password存入到用戶的數(shù)據(jù)庫。
PS:為何不用靜態(tài)的salt?沒有必要,使用一個(gè)動(dòng)態(tài)隨機(jī)足夠長的鹽足矣。
為何不用MD5?因?yàn)殚L度不夠。
為何沒有使用多次HASH?因?yàn)檫@樣反而容易發(fā)生碰撞。
HASH好之后怎么使用“腌制”好的密碼?
用戶注冊(cè)-提交密碼-產(chǎn)生salt-腌制好的密碼存入數(shù)據(jù)庫-salt存入數(shù)據(jù)庫。
用戶登錄-提交密碼-調(diào)用salt接到提交密碼的后面-進(jìn)行HASH-調(diào)用之前注冊(cè)腌制好的密碼-對(duì)比HASH值是否和這個(gè)密碼相同
PHP腳本中的鏈接數(shù)據(jù)庫的用戶名跟密碼怎么加密?
不需要加密,也無法加密??梢赃@么說,如果數(shù)據(jù)庫和程序是在同一服務(wù)器,及數(shù)據(jù)庫的地址是localhost,那么無需加密,因?yàn)榧用芰藬?shù)據(jù)庫并不能自己解密,而且只要網(wǎng)站或者服務(wù)器不被攻下,沒有加密的必要。
數(shù)據(jù)庫和php程序在不同的服務(wù)器,就是說你在操作數(shù)據(jù)庫的時(shí)候需要遠(yuǎn)程操作,這樣的話需要傳輸數(shù)據(jù)庫賬號(hào)密碼,可以在本地加密后傳輸,然后在數(shù)據(jù)庫服務(wù)器進(jìn)行解密后,用原始的賬號(hào)密碼去操作數(shù)據(jù)庫。
--------------------------------------------------------一般來說,如果你擔(dān)心服務(wù)器被攻下,那么你加密數(shù)據(jù)庫賬號(hào)密碼是多余的,因?yàn)槿思蚁螺d你的源碼一看就知道鳥。
標(biāo)題名稱:php網(wǎng)頁數(shù)據(jù)庫密碼加密 php文件加密解密
當(dāng)前路徑:http://fisionsoft.com.cn/article/dosojoi.html