成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

PHP筆記 —— crypt方法

loostudy / 1562人閱讀

摘要:關(guān)于方法是一個(gè)單向的字符串哈希方法。另外,在之前的分支版本以及之前的分支版本,如果的值為,會(huì)返回一個(gè)使用算法的哈希值,而之后的版本則返回。

關(guān)于方法

crypt是一個(gè)單向的字符串哈希方法。

string crypt ( string $str [, string $salt ] )

$str是需要進(jìn)行哈希的字符串。

$salt是進(jìn)行哈希時(shí)使用鹽值,是個(gè)可選項(xiàng)。

例如以下代碼:


會(huì)輸出類似的結(jié)果:

$1$1Y.rRSxY$htFPrMkCbV.Av.yh2lTJd.

注意:從PHP 5.6.0開始,如果沒(méi)有傳$salt參數(shù),會(huì)報(bào)E_NOTICE錯(cuò)誤。

關(guān)于鹽值

我們既沒(méi)有指定使用的算法,也沒(méi)有指定鹽值,crypt是怎么知道使用什么算法和鹽值的呢?其實(shí)crypt是根據(jù)$salt參數(shù)來(lái)判斷使用哪種哈希算法。也就是說(shuō),$salt本身就包含了算法的類型以及哈希時(shí)實(shí)際用到鹽值。

我們先來(lái)看看,如果沒(méi)有傳$salt的話,crypt會(huì)如何處理。 在5.3版本前,PHP在安裝的時(shí)候會(huì)根據(jù)系統(tǒng)的crypt()方法檢測(cè)可用的算法。如果沒(méi)有提供$salt參數(shù),PHP會(huì)使用自動(dòng)產(chǎn)生一個(gè)標(biāo)準(zhǔn)的兩個(gè)字符(DES)的鹽值或者一個(gè)12個(gè)字符(MD5)的鹽值,視乎MD5算法是否可用。

從PHP 5.3版本開始,PHP包含了自身實(shí)現(xiàn)的crypt算法,包括MD5、標(biāo)準(zhǔn)DES、擴(kuò)展DES和Blowfish算法。如果系統(tǒng)不支持這些算法,就會(huì)使用PHP自己實(shí)現(xiàn)的。例如上面那個(gè)例子,最終使用的是MD5算法的鹽值。

PHP設(shè)置了一個(gè)常量CRYPT_SALT_LENGTH,用來(lái)表示鹽值最大允許的長(zhǎng)度。

關(guān)于算法

那crypt是怎么根據(jù)鹽值判斷不同的算法呢?其實(shí)它是按照一定規(guī)則去匹配鹽值,如果符合某個(gè)算法的規(guī)則,就表示使用哪種算法。我們逐一看下目前支持的幾種算法。

標(biāo)準(zhǔn)DES(Standard DES)

在沒(méi)有匹配到其他算法的情況下,則使用標(biāo)準(zhǔn)DES算法,此時(shí)取前兩個(gè)字符為鹽值(不足兩個(gè)字符則返回*0):


鹽值的字符必須是./0-9A-Za-z里的字符,否則會(huì)引起 crypt()失?。▊€(gè)人測(cè)了下,好像字符的范圍要比文檔里說(shuō)的大)。

使用這個(gè)算法時(shí),$str只取前面8個(gè)字符,所以無(wú)論字符串有多長(zhǎng),如果前8個(gè)字符一樣,在鹽值一樣的情況下,返回的哈希值也是一樣的。

擴(kuò)展DES(Extended DES)

以下劃線_開頭,后面緊接著4字節(jié)的迭代次數(shù)和4字節(jié)的鹽值:


同樣的,那8個(gè)字節(jié)的字符必須是./0-9A-Za-z里的字符。

MD5

$1$開頭,然后是12個(gè)字符以內(nèi)的鹽值:


其實(shí)例子里的$1$rasmusle$最后一位改成任何字符都不會(huì)影響結(jié)果,例如$1$rasmuslea$1$rasmusle1得到的結(jié)果跟$1$rasmusle$是一樣的,因?yàn)樽詈笠晃灰欢ㄊ?b>$,沒(méi)有的話會(huì)自動(dòng)補(bǔ)上。例如$1$rasm會(huì)變成$1$rasm$,$1$會(huì)變成$1$$

Blowfish

$2a$、$2x$或者$2y$開頭,然后是用于cost參數(shù)的兩位數(shù)字,緊接著一個(gè)$字符,最后是22位./0-9A-Za-z范圍里的字符:


兩位數(shù)字用于表示Blowfish算法的迭代次數(shù),是以2位底的對(duì)數(shù),范圍為04-31。在PHP 5.3.7版本之前,只支持$2a$作為前綴,5.3.7之后,增加了$2x$$2y$兩種前綴,用于解決一些安全性問(wèn)題。如果使用5.3.7版本或以上,建議使用$2y$

使用這個(gè)算法的時(shí)候,$str最長(zhǎng)支持72個(gè)字符,超過(guò)會(huì)被截掉。

SHA256

$5$開頭,然后是16個(gè)字符的鹽值,鹽值之前還可以使用rounds=$的格式表明哈希的循環(huán)次數(shù)(N):


rounds的默認(rèn)值為5000,范圍是1000到999,999,999,如果N不在這個(gè)范圍里,會(huì)被截取到最接近的范圍里。

PHP 5.3.2增加的算法,算法的實(shí)現(xiàn)基于Ulrich Drepper的實(shí)現(xiàn)。

SHA512

$6$開頭,然后是16個(gè)字符的鹽值,鹽值之前還可以使用rounds=$的格式表明哈希的循環(huán)次數(shù)(N):


rounds的默認(rèn)值為5000,范圍是1000到999,999,999,如果N不在這個(gè)范圍里,會(huì)被截取到最接近的范圍里。

PHP 5.3.2增加的算法,算法的實(shí)現(xiàn)基于Ulrich Drepper的實(shí)現(xiàn)。

如何判斷支持哪種算法

crypt提供了以下的常量來(lái)標(biāo)識(shí)是否支持某個(gè)算法(1表示支持,0表示不支持):

CRYPT_STD_DES

CRYPT_EXT_DES

CRYPT_MD5

CRYPT_BLOWFISH

CRYPT_SHA256

CRYPT_SHA512

關(guān)于輸出結(jié)果

從上面的那些例子的輸出可以看到,crypt方法輸出的結(jié)果其實(shí)包含了鹽值本身。所以我們能從輸出結(jié)果的本身知道這個(gè)結(jié)果是使用哪個(gè)算法和什么鹽值進(jìn)行運(yùn)算的。

另外,如果鹽值包含了非法的字符,例如通常鹽值都要求是./0-9A-Za-z范圍里的字符,如果不是的話,crypt會(huì)返回結(jié)果*0。另外,在5.5.21之前的5.5分支版本以及5.6.5之前的5.6分支版本,如果$salt的值為*0,會(huì)返回一個(gè)使用DES算法的哈希值,而之后的版本則返回*1。

關(guān)于驗(yàn)證

要驗(yàn)證一字符串的哈希值,我們一般是用相同的鹽值相同的算法進(jìn)行一次運(yùn)算,然后跟之前的值進(jìn)行比較。而使用crypt方法,由于它的輸出結(jié)果本身就帶有算法和鹽值的信息,我們只需要把輸出結(jié)果當(dāng)做$salt參數(shù)即可:


為了防止基于時(shí)間的攻擊,PHP 5.6提供了一個(gè)更為安全的字符串比較方法hash_equals(),建議使用:


參考

http://php.net/manual/en/func...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/22873.html

相關(guān)文章

  • PHP加密與實(shí)際應(yīng)用

    摘要:加密算法以字符十六進(jìn)制數(shù)字形式返回散列值。加密算法是加密是的干擾碼,使編碼更安全可選的鹽值字符串。返回的數(shù)據(jù)可能是二進(jìn)制的 數(shù)據(jù)加密可以簡(jiǎn)單的理解為:明文(文件或者數(shù)據(jù))-->算法處理-->不可讀的密文,進(jìn)而達(dá)到加密的效果。 php中的幾種加密方式 md5加密算法 crypt算法 sha1加密算法 URL編碼技術(shù)編碼 base64編碼 其中 md5、crypt、sha1 都是單向加...

    lakeside 評(píng)論0 收藏0
  • phalcon簡(jiǎn)易指南

    摘要:幫助你開始使用的簡(jiǎn)易指南。第一種方式參考第二種方式參考使用參考簡(jiǎn)單粗暴的理解是把下的對(duì)應(yīng)成數(shù)據(jù)庫(kù)的表,類屬性對(duì)應(yīng)表字段。 幫助你開始使用 phalcon 的簡(jiǎn)易指南。 簡(jiǎn)介 Phalcon 2將于2015年4月17日發(fā)布,這個(gè)版本大約85%的代碼是基于 Zephir 語(yǔ)言重寫的。Zephir是開源的,使用類似PHP語(yǔ)法的語(yǔ)言,生成C語(yǔ)言代碼,并編譯成PHP擴(kuò)展。這提高了PHP擴(kuò)展的開發(fā)...

    whataa 評(píng)論0 收藏0
  • Golang 實(shí)現(xiàn)RSA 加密解密(附帶php

    摘要:安全總是很重要的,各個(gè)語(yǔ)言對(duì)于通用的加密算法都會(huì)有實(shí)現(xiàn)。對(duì)于和加密算法本身,請(qǐng)查閱相關(guān)資料在中,很多功能經(jīng)常是一個(gè)函數(shù)解決而中的卻不是。該文討論加密解密。一概要這是一個(gè)非對(duì)稱加密算法,一般通過(guò)公鑰加密,私鑰解密。 安全總是很重要的,各個(gè)語(yǔ)言對(duì)于通用的加密算法都會(huì)有實(shí)現(xiàn)。前段時(shí)間,用Go實(shí)現(xiàn)了RSA和DES的加密解密,在這分享一下。(對(duì)于RSA和DES加密算法本身,請(qǐng)查閱相關(guān)資料) 在P...

    kun_jian 評(píng)論0 收藏0
  • 10 個(gè) Nginx 的安全提示

    摘要:聲明是重寫模塊評(píng)估指令強(qiáng)制性的部分??雌饋?lái)唯一正確的解決方案是在非重寫的指令內(nèi)完全禁用。我們上周發(fā)布了這個(gè)流行指令的潛在安全漏洞介紹。將設(shè)低來(lái)防止攻擊。限制用戶連接數(shù)來(lái)預(yù)防攻擊。認(rèn)證默認(rèn)使用,它的哈希并不安全。保持與最新的安全更新。 Nginx是當(dāng)今最流行的Web服務(wù)器之一。它為世界上7%的web流量提供服務(wù)而且正在以驚人的速度增長(zhǎng)。它是個(gè)讓人驚奇的服務(wù)器,我愿意部署它。 下面是一個(gè)常...

    wemall 評(píng)論0 收藏0
  • 10 個(gè) Nginx 的安全提示

    摘要:聲明是重寫模塊評(píng)估指令強(qiáng)制性的部分??雌饋?lái)唯一正確的解決方案是在非重寫的指令內(nèi)完全禁用。我們上周發(fā)布了這個(gè)流行指令的潛在安全漏洞介紹。將設(shè)低來(lái)防止攻擊。限制用戶連接數(shù)來(lái)預(yù)防攻擊。認(rèn)證默認(rèn)使用,它的哈希并不安全。保持與最新的安全更新。 Nginx是當(dāng)今最流行的Web服務(wù)器之一。它為世界上7%的web流量提供服務(wù)而且正在以驚人的速度增長(zhǎng)。它是個(gè)讓人驚奇的服務(wù)器,我愿意部署它。 下面是一個(gè)常...

    meteor199 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<