Hash

使用 SHA1 混淆已發布的資源 ID

  • May 22, 2021

首先,是的,我確實知道 SHA1 在密碼學上是不安全的(並且已經存在很長時間了)。所以這個問題比什麼都更學術。這也很做作,但請耐心等待。

我想發布一個string帶有時間戳的 ID 表,但同時我不希望有人能夠查看該表並使用它來列舉所有可用資源。

TmQ5YqqOOPPiEewdntZx  2021-05-05 13:26:38
SVQBu941OWIyDXzSgo2F  2021-05-05 13:26:44
gkxMiz6hEPqV36TidyeG  2021-05-07 09:56:43
vU2OxFFQ4I0gXHGofL8A  2021-05-07 09:56:43

所以我可以散列表中的 ID(HMAC 沒有意義,因為客戶端需要知道表生成器使用的秘密):

d3399d662fc58daf44647f188cb6ef30bf76938c    2021-05-05 13:26:38
fc95d2f3af27034ff5a991d5b9a0080cbf45d007    2021-05-05 13:26:44
cd982afcff4ae5e907960f51ae1504a38f4665d1    2021-05-05 13:53:42
e0f31185494f54a3a16ac3483572989f98850c36    2021-05-07 09:56:43

已經知道 ID 的客戶端可以對其進行散列,在公共表中查找它並檢查時間戳。對於不知道 ID 的人來說,該表應該是無用的。

我的想法是:

  • 儘管 SHA1 在密碼學上是不安全的,但我不是用它來驗證 ID,而是用它來混淆
  • 即使有人可以產生衝突,它也不會給他們請求資源所需的 ID
  • 我不想使用 SHA2,因為我可以生成的最短雜湊是 256 位,這會多消耗 60% 的儲存空間(想像一下我有很多,而且我很便宜!)。

明顯的反應將是:

  1. 只需使用 SHA2,這是一個有效的響應。如果我擔心儲存空間和傳輸成本,我可以截斷雜湊。160 位仍然是比 62^20 更大的地址空間,因此不太可能發生衝突
  2. 只是 SHA2,它比 SHA1 快。是的,實際上 SHA512 比 SHA256 快(無論如何在 .Net 中)
  3. 用別的東西。

如果#3,請告訴我。

顯然,我將使用 SHA2,但在這種情況下是否有不使用 SHA1(如果我感覺很復古,甚至是 MD5)的加密原因。就像我說的,這個問題主要是學術性的。

(我應該)使用其他東西(不是 SHA-1)嗎?

的。這似乎是用於密碼散列的故意慢速散列的一個很好的應用,例如Argon2id,或者它的祖先scrypt,或者(如果在上下文中所有其他都是unobtainium)SHA-2 後跟bcrypt(甚至不要Google PBKDF2-HMAC -SHA-1,已過時)。

這些就像 SHA-1,它的抗碰撞性較少的密碼破解,加上一個輸出大小參數,作為 HMAC 或/和其他鹽/相關數據的密鑰的過多額外輸入,如果需要的話。最重要的是調整執行速度的參數;整個事情的製作方式使得使用 GPU 或 ASIC 進行有效搜尋的對手string不會像合法使用者那樣獲得比使用 CPU 更大的優勢。

這將使您能夠以相同的大小和數量的 ID 顯著提高安全性,或/和安全地減小 ID 的大小。只需將並行度參數調整為使用系統的所有平台上的最小物理執行緒數(可能少於 1 或 2 以保持使用者響應,但至少為 1;如果有疑問,請使用 1);memorySizeKB到所有平台上可用的最低可用 RAM(對於所有執行緒,少一個公平的安全緩衝,包括用於啟動規定數量的執行緒/程序);然後將迭代提高到所有平台上都可以容忍的程度。

引用自:https://crypto.stackexchange.com/questions/90066