2015-11-22 48 views
0

這是我想出來存儲cookie來驗證我的網站上的用戶。我的Cookie代幣應該保存多久?

多久應該令牌是我產生?是33還是應該是64?而且我的這一代足夠安全嗎?

<?PHP 
$token = bin2hex(openssl_random_pseudo_bytes(33)); 
echo $token.'<br>'; 
$hash = hash('sha256', $token); 
echo $hash; 

//Test user db and local cookie 
    $stored_hash = '5be39777ad41916c5fa1e78681bfc8793a5cfe7c27842846ad23396e44b390a7'; 
    $cookie = '1a9243f95354252d937d2b99e64a7eeb462e00c72b26d488426f08ef11667522c6'; 

$cookie_hash = hash('sha256', $cookie); 

if(hash_equals($stored_hash, $cookie_hash)) 
    echo 'true'; 
else 
    echo 'false'; 
?> 
+0

如何偏執,你有什麼感覺?你將要存儲多少令牌? –

+0

約有10k個用戶。至於偏執只是想要安全。有33和64長度的巨大安全差異嗎? – user2570937

+0

只需使用會話cookie和修改php.ini,特別是散列函數和每個字符的散列位,http://php.net/manual/en/session.configuration.php#ini.session.hash-function – Xorifelse

回答

1

首先建議改善令牌,而不是使用十六進制表示,我會建議使用base62編碼。這樣的字符串包含大寫和小寫字符,因此可以用相同的信息縮短。

接下來讓我們假設你創建了一個有20個base62編碼字符的隨機標記,這將允許700'000'000'000'000'000'000'000'000'000'000'000'000組合!即使您可以使用15 Giga SHA256/second進行蠻力攻擊,也需要大約7E17年才能找到正確的令牌。這樣一個有20個字符的標記只需要15個字節,所以你在第一種方法中建議的33個字節肯定綽綽有餘。

我寫了一個小class幫助產生這樣的base62令牌,看看它,如果你有興趣。

+0

@RyanVincent - 無base62編碼的字符串包含0-9 A-Z A-Z,而base64編碼串還包含+和=字符,在一個URL中使用時,其可能會導致問題。 – martinstoeckli

+0

我很抱歉 - 我的壞!我剛剛學到了一些新的信息。謝謝。 –

+0

@RyanVincent - 應該明確提到它,沒有問題。 – martinstoeckli