Hash

防止與 HMAC 機密作為 IV 的雜湊衝突

  • September 4, 2016

我們的組織希望散列大文件路徑以分配給特定對象。為了防止雜湊衝突,我認為我們可以使用與防止密碼雜湊中的彩虹表相同的技術。當您散列值“樣本數據”時,我們將首先添加一個 IV,它將用作 hmac 機密來驗證散列。

function makeHash($data,$algo='sha256',$ivKey=null) {
 if(empty($ivKey)) {
  $ivKey = openssl_random_pseudo_bytes(16);
 }

   $result = $ivKey.hash_hmac($algo,$data,$ivKey,true);
  return base64_encode($result);
}

function verifyHash($data,$hash,$algo='sha256') {

 $result = base64_decode($hash);
  $ivKey =  mb_substr($result,0,16,'8bit');
  $dataHash = makeHash($data,$algo,$ivKey);

 return $hash == $dataHash;
}

使用範例:

$hash = makeHash('sample data');
echo $hash;
var_dump(verifyHash('sample data',$hash));
/**
Output:
I9Kl9Mkq/6ee3xQixrDn3YImRAywz0rhmBBxRjrfRWiGeRuBrIkREirgKBDr8Gzh
bool(true) 
*/

這是防止碰撞的好方法嗎?

可能不會,除非您嘗試保護的路徑包含一個足夠大的秘密,以至於無法暴力破解雜湊。

問題在於,這將通過匹配所有可能的值來防止人們找到路徑。但是假設可以很容易地猜出路徑,則可能不足以防止一次暴力破解一條路徑。此外,如果您有一個分層樹並且您還散列了特定分支的根,那麼您可以首先暴力破解根,然後是第一個子目錄……直到您到達所需的結束節點。

大多數時候,人們會通過保留一個 map來保護 URL ,其中大約 64 到 128 位的隨機值被映射到特定的 URL(或路徑)。顯然,地圖本身必須保持安全。

您可以通過實際使用具有高迭代次數的 PBKDF2 稍微批准您的算法。但即使有這種蠻力,這條路也是可行的。

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