2012-05-09 23 views
3

我有一個鏈接需要生成,以便它可以放在電子郵件中。當用戶點擊這個鏈接時,系統意味着將電子郵件中發送的代碼與用戶相匹配,因此它可以提取該用戶的記錄。哈希或加密變量將在url中發送

但是,我不太確定使用哪種加密/散列方法。對於本站點上管理系統的登錄,我在數據庫中使用PBKDF2作爲密碼(含salting)和AES加密時發送到會話變量,但我不知道PBKDF2使用的字符是否爲& AES與網址兼容。

基本上,我需要散列/爲數據庫中的存儲生成隨機代碼和加密方法的最佳方法,以便我可以在網址中放置一年和代碼(我之前提到過)。如果有幫助,我使用PHP和MySQL。

你們認爲什麼?

+0

不用擔心有:一個URL可以代表任何字符,甚至是多字節的,只要它是正確編碼。 – netcoder

回答

6

的大多數加密(或散列等)例程的輸出是任意的二進制數據,這是不能被安全地包含在URL而不對其進行編碼。

As eggyal notes,簡單地使用上的數據urlencode()應該夠了。但是,標準的URL編碼可能不是編碼隨機二進制數據最緊湊的方式。 Base64編碼效率更高,但不幸的是,由於使用了+字符,因此不完全保護URL。

幸運的是,存在的base64編碼的標準化網址安全的變體,在RFC 4648指定爲「base64url」。下面是使用這種編碼在PHP,based on this answer by "gutzmer at usa dot net"編碼和解碼數據的一對函數:

function base64url_encode($data) { 
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); 
} 

function base64url_decode($data) { 
    return base64_decode(strtr($data, '-_', '+/')); 
} 

(我已經簡化解碼功能了一下,因爲PHP的至少當前版本顯然不需要=填充字符輸入到base64_decode()。)


Ps。爲了安全地生成隨機令牌,首先參見例如this question

+0

如果我們使用的是base64,那麼使用php的base64_encode()和base64_decode()函數呢? –

+0

@Phil:我_am_使用它們,但它們需要與'strtr()'結合以產生URL安全輸出。 –

+0

@llmari什麼是最好的方式來存儲從該鏈接獲得的僞隨機字節以生成代碼? –

4

將其插入到URL之前執行自己的喜好哈希,然後urlencode()結果。