成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP筆記 —— crypt方法

loostudy / 1519人閱讀

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

關(guān)于方法

crypt是一個單向的字符串哈希方法。

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

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

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

例如以下代碼:


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

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

注意:從PHP 5.6.0開始,如果沒有傳$salt參數(shù),會報E_NOTICE錯誤。

關(guān)于鹽值

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

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

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

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

關(guān)于算法

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

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

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


鹽值的字符必須是./0-9A-Za-z里的字符,否則會引起 crypt()失敗(個人測了下,好像字符的范圍要比文檔里說的大)。

使用這個算法時,$str只取前面8個字符,所以無論字符串有多長,如果前8個字符一樣,在鹽值一樣的情況下,返回的哈希值也是一樣的。

擴(kuò)展DES(Extended DES)

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


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

MD5

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


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

Blowfish

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


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

使用這個算法的時候,$str最長支持72個字符,超過會被截掉。

SHA256

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


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

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

SHA512

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


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

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

如何判斷支持哪種算法

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

CRYPT_STD_DES

CRYPT_EXT_DES

CRYPT_MD5

CRYPT_BLOWFISH

CRYPT_SHA256

CRYPT_SHA512

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

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

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

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

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


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


參考

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/22873.html

相關(guān)文章

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

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

    lakeside 評論0 收藏0
  • phalcon簡易指南

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

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

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

    kun_jian 評論0 收藏0
  • 10 個 Nginx 的安全提示

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

    wemall 評論0 收藏0
  • 10 個 Nginx 的安全提示

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

    meteor199 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<