国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP筆記 —— crypt方法

loostudy / 1510人閱讀

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

關于方法

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

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

$str是需要進行哈希的字符串。

$salt是進行哈希時使用鹽值,是個可選項。

例如以下代碼:


會輸出類似的結果:

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

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

關于鹽值

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

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

從PHP 5.3版本開始,PHP包含了自身實現的crypt算法,包括MD5、標準DES、擴展DES和Blowfish算法。如果系統不支持這些算法,就會使用PHP自己實現的。例如上面那個例子,最終使用的是MD5算法的鹽值。

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

關于算法

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

標準DES(Standard DES)

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


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

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

擴展DES(Extended DES)

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


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

MD5

$1$開頭,然后是12個字符以內的鹽值:


其實例子里的$1$rasmusle$最后一位改成任何字符都不會影響結果,例如$1$rasmuslea$1$rasmusle1得到的結果跟$1$rasmusle$是一樣的,因為最后一位一定是$,沒有的話會自動補上。例如$1$rasm會變成$1$rasm$$1$會變成$1$$

Blowfish

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


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

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

SHA256

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


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

PHP 5.3.2增加的算法,算法的實現基于Ulrich Drepper的實現。

SHA512

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


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

PHP 5.3.2增加的算法,算法的實現基于Ulrich Drepper的實現。

如何判斷支持哪種算法

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

CRYPT_STD_DES

CRYPT_EXT_DES

CRYPT_MD5

CRYPT_BLOWFISH

CRYPT_SHA256

CRYPT_SHA512

關于輸出結果

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

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

關于驗證

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


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


參考

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22873.html

相關文章

  • PHP加密與實際應用

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

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

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

    whataa 評論0 收藏0
  • Golang 實現RSA 加密解密(附帶php

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

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

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

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

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

    meteor199 評論0 收藏0

發表評論

0條評論

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