2011-02-11 48 views
2

我有一個非常簡單的(而不是愚蠢的)問題,我希望有人可以清除我的腦海裏對這個:)發送加密的文字在地址

我想一旦他點擊了一個按鈕,發送電子郵件到我的網站的用戶。該電子郵件將在鏈接URL中包含與用戶的用戶ID鏈接(作爲鏈接的查詢參數)。

一旦用戶點擊此郵件鏈接,我的服務器端代碼將解析和解密userID查詢字符串鍵以獲取用戶ID並對其執行一些操作。

我不能使用base64編碼,因爲它可以顛倒,'黑客'可以知道真正的用戶ID。我必須對ID進行加密,但是當我使用AES算法進行加密時,加密文本對於瀏覽器來說是不可理解的,即我無法將加密的userId文本作爲URL的一部分傳遞,因爲它包含未編碼的字符「/」瀏覽器不能通過。我可以想到的一個選擇是base64對加密文本進行編碼,只要我通過URL發送它即可。然後我可以解碼並解密它。

這種方法比在加密文本上使用Uri.EscapeDataString()更好嗎?

+0

這些標籤有什麼相關性?你可能想考慮在http://security.stackexchange.com或http://webmasters.stackexchange.com上詢問。 – Zooba 2011-02-11 10:47:04

+1

發送一個密鑰/令牌給用戶,並通過使用它擊中分貝,並抓住userId並從數據庫鏈接。我認爲這更安全。 (一旦鏈接被使用,將其標記爲在數據庫中過期) – hazimdikenli 2011-02-11 10:52:19

回答

3

使用SHA1或MD5之類的單向散列,並使用JavaScript以加密方式發送值。然後,如果黑客攔截請求,他們只會有散列而不是實際值。儘管如此,他們仍然可以發送哈希登錄。一個解決方案是包括基於IP(但不可能被黑客找到一個公式)一個JavaScript參數(通過你的服務器端語言生成),並用它來鹽的用戶名和密碼的哈希值。

然後在服務器端,你會怎麼做(在PHP中,在這種情況下):

$ipHash = sha1("random" . $_SERVER['REMOTE_ADDR'] . "salt_here10381") // place this as a hidden element in the form and use it in the JavaScript to calculate the hash 
$userHash = $_POST['userHash']; 
$passwordHash = $_POST['passwordHash'] 
// TODO: Escape $ipHash, $userHash, $passwordHash 
$results = mysqli->query("SELECT * FROM `users` WHERE SHA1(CONCAT('" . $ipHash . "', `user`)) ='$userHash' AND SHA1(CONCAT('" . $ipHash . "', `password`)) = " '$passwordHash'"); 

然後,如果黑客想通過散列和用戶名,他們發現登錄,他們需要相同的IP用戶最初登錄的憑據被截取。

請注意,這假定您的密碼以純文本形式存儲在您的數據庫中,您不應該這樣做。

對於用SHA1進行哈希處理,在客戶端,看看this。爲了回答您的具體問題(我看到我有點偏離主題,oops),當將它們發送到服務器時,base64編碼哈希將是可以接受的。如果可能,請嘗試將其作爲POST數據發送並將其保存在cookie或會話變量中。

+1

原始問題指出userID是一個查詢參數,這意味着它需要呈現該頁面並且因此需要解密。散列算法不會解決加密問題。 – Snekse 2013-06-03 16:04:24

2

您應該繼續base64編碼AES數據,因爲此時它可能是二進制而不是可以逃逸的字符串。你還應該檢查你是否使用了url安全的base64編碼。

0

我認爲一個簡單的解決方案的嘗試產生一個隨機數(使其作爲密鑰)和加密使用自己的一些簡單的技術,像XOR「荷蘭國際集團字符的ASCII值與用戶名你已經生成的密鑰,所以長隨機密鑰會產生更好的結果。

0

當創建你需要加密的用戶ID的郵件,然後使用Base64編碼,然後URL編碼。把它作爲鏈接中的用戶ID參數。

解密電子郵件時,您的操作相反;獲取用戶ID參數,URL解碼,base64解碼,然後解密。

記得使用不同的intitialisation矢量每次編碼的用戶ID的時間。您需要將初始化矢量作爲URL參數放入電子郵件鏈接以解密。