真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php中密碼的加密處理及安全措施-創(chuàng)新互聯(lián)

在數(shù)據(jù)庫(kù)中保存明文密碼是非常不明智的選擇,其危害不言而喻。

成都創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)平順,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792

這里就不討論明文密碼的缺點(diǎn)了,只談?wù)勅绾伟踩谋4婷艽a。

基本的安全措施如下:

1.設(shè)置密碼最小位數(shù)

2.將用戶的密碼加密保存

3.通過(guò)重置密碼的一次性鏈接修改密碼

4.同一IP或mac地址一天內(nèi)只能獲取3次重置郵件

5.用戶修改密碼時(shí)需輸入原密碼

6.用戶信息被修改后發(fā)送短信/郵件提醒

當(dāng)然還可以采取更安全的措施:

7.不常用設(shè)備登陸需手機(jī)短信驗(yàn)證(需要短信平臺(tái))

8.設(shè)置安全問(wèn)答信息

9.記錄錯(cuò)誤登陸請(qǐng)求信息,多次錯(cuò)誤后拒絕登陸嘗試

--------------------------------------------------------------------------

第一項(xiàng):密碼的加密保存

通常情況下md5是最常用也是最簡(jiǎn)單的,但也是破解方法最多的一種方法。

php 5.5及以上版本中提供了Password Hashing API, 非常方便的解決了密碼加密問(wèn)題

http://tw2.php.net/manual/zh/ref.password.php

密碼加密

 10     //'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), 不推薦手動(dòng)設(shè)置鹽值 ]; $hash = password_hash("123456", PASSWORD_BCRYPT, $options); ?>

注意手動(dòng)設(shè)置鹽值在這里不被推薦,在php7里已經(jīng)廢掉這個(gè)選項(xiàng)。

password_hash中的第二個(gè)參數(shù)是對(duì)算法的設(shè)置,有兩個(gè)選項(xiàng):

  1. 默認(rèn)為PASSWORD_DEFAULT,現(xiàn)在的算法為bcrypt, 但這個(gè)算法會(huì)隨著php版本的更新而更新更強(qiáng)的算法,建議數(shù)據(jù)庫(kù)字段設(shè)置為char(255)。

  2. PASSWORD_BCRYPT,算法也是bcrypt,(手冊(cè)上寫(xiě)的CRYPT_BLOWFISH,其實(shí)就是crypt()使用CRYPT_BLOWFISH算法),結(jié)果永遠(yuǎn)是60個(gè)字符串,字段設(shè)置為char(60)即可。

簡(jiǎn)單的說(shuō)password_hash就是把bcrypt封裝了起來(lái),而且會(huì)隨著以后版本的更新而改進(jìn)提升所使用的算法,就現(xiàn)階段來(lái)講,bcrypt已經(jīng)足夠安全了。

-------------------

順道解釋一下什么是 cost(消耗) 和 salt(鹽值)

cost:消耗--是用來(lái)對(duì)付暴力破解的,隨著計(jì)算機(jī)速度的不斷提升,我們可以讓一臺(tái)計(jì)算機(jī)幾十年不關(guān)機(jī)來(lái)破解一個(gè)密碼,所以我們?nèi)藶榈募由弦粋€(gè)消耗值,使計(jì)算機(jī)的算法變慢一點(diǎn),當(dāng)然變慢的這一點(diǎn)對(duì)單次運(yùn)算影響不大,但暴力破解時(shí)間就要延長(zhǎng)到幾千上萬(wàn)年了。

salt:鹽值--用于對(duì)付彩虹表(不知道自行百度一下),鹽值作為一個(gè)干擾項(xiàng),使每次hash產(chǎn)生的密文均不相同,抵御彩虹表破解。

-------------------

密碼驗(yàn)證

//$hash,從數(shù)據(jù)庫(kù)里讀取的加密字符串 if (password_verify('password', $hash)) {     //驗(yàn)證通過(guò) } else {     //驗(yàn)證錯(cuò)誤 }

檢查加密措施是否需要升級(jí)

//檢查hash是否由bcrypt加密,如果不是則需要升級(jí),返回true if (password_needs_rehash ($current_hash, PASSWORD_BCRYPT)) {    $new_hash = password_hash($password, PASSWORD_BCRYPT) }

獲取加密信息

password_get_info只能用于password_hash生成的hashing

-----------------------------------------------

如果你使用的是php5.5以下版本,可用以下方法(也是我現(xiàn)在使用的方法,原理上是一樣的)替代:

class Password {     private static $algo = '$2a', $cost = '$10';          public static function unique_salt() {         return substr(sha1(mt_rand()),0,22);     }     public static function hash($password) {         return crypt($password,             self::$algo .             self::$cost .             '$' . self::unique_salt());     }     public static function check_password($hash, $password) {         $full_salt = substr($hash, 0, 29);         $new_hash = crypt($password, $full_salt);         return ($hash === $new_hash);     }      }

-------------------------

第二項(xiàng):密碼的一次性的重置鏈接

一次性鏈接有這么兩特點(diǎn):

  1. 在鏈接生成的一定時(shí)間內(nèi)(比如24小時(shí))點(diǎn)擊有效

  2. 一旦密碼被重置,鏈接立即失效

既然這樣,就需要記錄鏈接的是否過(guò)期,有以下幾種思路:

  1. 數(shù)據(jù)庫(kù)中保存鏈接生成時(shí)間和鏈接是否已被使用(考慮用一個(gè)字段記錄信息)。

  2. 利用opcode緩存,需要安裝xcache或其他類似工具

我現(xiàn)在用的便是xcahce,主要考慮到保存到庫(kù)中會(huì)增加開(kāi)銷。

public function generate_link($username,$hash){         if (function_exists('xcache_isset')) {             //將username加密作為我們的unique_id             $unique_id = md5($username);                          //將username保存到名為unique_id的緩存中,設(shè)置緩存24小時(shí)候過(guò)期             xcache_set($unique_id, $username, 24*60*60);                          //將username和hash加密作為驗(yàn)證信息(不放心的話可以在加一個(gè)公匙在里面)             $validate = md5($username.$hash);                          //拼接成字符串             $string = $unique_id.$validate;             //生成重置密碼的鏈接             $link = $_SERVER['SERVER_NAME']."/reset-password?p=".$string;             return $link;         }     } //檢查鏈接是否合法 public function check_link($p){         if (function_exists('xcache_isset')) {             //獲取鏈接中的unique_id             $unique_id = substr($p, 0, 32);             if(xcache_isset($unique_id)){                 //通過(guò)unique_id讀取username                 $username = xcache_get($unique_id);                                  //通過(guò)username讀取hash                 $hash = findHashByUsername($username);                 //獲取鏈接中的驗(yàn)證信息                 $link_md5 = substr($p,32);                 if($link_md5 === md5($username.$hash)){                     //鏈接驗(yàn)證成功                 }else{                     //鏈接驗(yàn)證失敗                     redirect();                 }             }else{                 redirect();             }         }     }

記住密碼重置后要立即清除$unique_id的緩存

if(updateLoginPassword($username,$password)){      xcache_unset($unique_id); }

第三項(xiàng):設(shè)置同一IP一天內(nèi)的重置密碼次數(shù)限制

和一次性鏈接很像,也有兩種思路:

  1. 將ip存到數(shù)據(jù)庫(kù)

  2. 將ip信息通過(guò)xcache保存

我就只給大家提供一個(gè)獲取ip的函數(shù)了,其他的大家自己補(bǔ)充吧

public static function validip($ip) { if (!empty($ip) && ip2long($ip)!=-1) { $reserved_ips = array ( array('0.0.0.0','2.255.255.255'), array('10.0.0.0','10.255.255.255'), array('127.0.0.0','127.255.255.255'), array('169.254.0.0','169.254.255.255'), array('172.16.0.0','172.31.255.255'), array('192.0.2.0','192.0.2.255'), array('192.168.0.0','192.168.255.255'), array('255.255.255.0','255.255.255.255') ); foreach ($reserved_ips as $r) { $min = ip2long($r[0]); $max = ip2long($r[1]); if ((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) return false; } return true; } else { return false; } } public static function getip() {         if (self::validip($_SERVER["HTTP_CLIENT_IP"])) {             return $_SERVER["HTTP_CLIENT_IP"];         }                  if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){             foreach (explode(",",$_SERVER["HTTP_X_FORWARDED_FOR"]) as $ip) {                 if (self::validip(trim($ip))) {                     return $ip;                 }             }         }                  $keys = array("HTTP_X_FORWARDED","HTTP_FORWARDED_FOR","HTTP_FORWARDED");                  foreach ($keys as $key){             if (self::validip($_SERVER[$key])) {                  return $_SERVER[$key];             }         }                  return $_SERVER["REMOTE_ADDR"];    }

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


標(biāo)題名稱:php中密碼的加密處理及安全措施-創(chuàng)新互聯(lián)
本文鏈接:http://weahome.cn/article/codigj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部