簡體   English   中英

如何改進PHP的NONCE庫?

[英]How can I improve this NONCE library for PHP?

這是我第一次使用nonce,所以我從http://fullthrottledevelopment.com/php-nonce-library下載了這個腳本。 我不喜歡這些代碼,特別是因為合法請求被視為無效,因為該函數在定義的時間間隔內工作(默認為300秒)。

例如,我們可以在生成隨機數的300秒內299秒,因此現時只能工作1秒。

我將庫修改為以下函數。 我做的是使用nonce_create(time()-NONCE_DURATION)==$nonce檢查當前間隔和上一個間隔。 有沒有辦法進一步改善功能?:

define( 'NONCE_UNIQUE_KEY' , '123123' );
define( 'NONCE_DURATION' , 300 );

function nonce_create($time=false){
    if(!$time)
        $time=time();
    $i=ceil($time/(NONCE_DURATION));
    return substr(md5($i.NONCE_UNIQUE_KEY),-12,10);
}

function nonce_is_valid($nonce){
    if (nonce_create()==$nonce || nonce_create(time()-NONCE_DURATION)==$nonce)
        return true;
    return false;
}

另外,我對原始庫有兩個問題:

  1. 為什么不使用NONCE_UNIQUE_KEY 作者是否完全忘了?
  2. 為什么作者在這里除以2: $i = ceil( time() / ( FT_NONCE_DURATION / 2 ) ); ,它只有一半的時間工作(我嘗試過)

這會產生一個Nonce,但它不是一個加密的nonce。 此庫生成的值不能用於安全性,因為它嚴重依賴於時間的使用。 攻擊者知道當前時間,並且知道您的服務器時間,因為它在http響應頭中。 另外md5()的prng輸出並不像應該的那樣隨機。 針對md5存在許多已知漏洞,並且絕不應該將其用於安全性。 另外10個字節的基本16非常小,16個字節的base256將是理想的。

如果您需要一個難以猜測的獨特值,那么在大多數情況下這將起作用:

sha1(uniqeid(mt_rand(),true));

但是,這不太理想。 輸出是base16,非常浪費空間。 uniqeid()仍然使用時間,但結果值中還有其他熵源。

到目前為止, Web應用程序的最佳熵源是/dev/urandom並使用fopen()來訪問它並讀出16個字節的base256內容。 / dev / urandom是一個熵存儲,它從操作系統,其硬件和系統上所有應用程序的行為中收集隨機源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM