簡體   English   中英

如何安全設置重置密鑰和登錄令牌?

[英]How do i securely make reset keys and login tokens?

在過去,我見過有人說要使用GUID,而且我敢肯定我會再見一次。

然后,在該問題中進行搜索並在寫下問題之前進行搜索,發現GUID不應用於與安全相關的任何事情。 所以我的問題是,我如何使隨機的64位數字作為重置密鑰或登錄密鑰? 建議我執行以下操作,但我聽說使用RNG時,如果兩個內核同時執行RNG,它將具有相同的種子,因此並不安全。 我是否應該使用帶有以下代碼的lock(rng){}的靜態函數並對其進行調用? 還有另一種方法嗎? 我應該怎么做?

using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider())
{
    byte[] inBytes = new byte[4];
    rng.GetBytes(inBytes);
    return BitConverter.ToInt64(inBytes,0);
}

安全密鑰不一定在密鑰中。 如果生成足夠長度的隨機密鑰,並將該密鑰與到期日期一起存儲在數據庫中,則您的解決方案應該足夠安全。 僅僅生成一個安全的哈希值不足以確保我的品味,但是如果密鑰必須在我的數據庫中,那么當我拿到一個密鑰時,我就可以充滿信心。

為什么要到期? 不一定是為了增加安全性,而僅僅是因為它們通常旨在立即使用。 如果用戶在一天內不使用密碼重設密鑰,我想使它過期並讓他們要求另一個。 重置消息出現在某個地方,如果它在網絡空間中游盪(可能在其他人的郵箱中),則最好限制它的壽命。

我所說的“信心”是什么意思? 簡單地說:密鑰很可能是我生成的密鑰。 如果密鑰只是內部一致的(安全哈希),那么如果有人偶然發現了我生成密鑰的方法,那么他們可以生成偽造的密鑰。 當然,如果我使用私鑰來生成哈希,他們將需要找到我的私鑰。 但是,如果這樣做了,那么我的數據庫就會被暴露出來。

另一方面,如果我生成一個大的隨機密鑰並將其存儲在數據庫中,那么破壞系統的唯一方法就是猜測數據庫中的密鑰。 如果我使它們過期,並且一旦使用它們就使它們失效,那么足夠大的密鑰將使這種可能性不大。 如果您添加了一些錯誤的猜測安全性,例如在幾次錯誤的猜測之后重定向離開后門頁面,那么您將很難讓人猜到重置或后門密鑰。 這樣,我“確信”我成功授權了后門嘗試,並且可以在我的應用程序中使用該算法。

我們在大型付款流程應用程序中執行此操作。 我們和客戶對提供的安全性感到非常滿意。

暫無
暫無

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

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