Hash
防止與 HMAC 機密作為 IV 的雜湊衝突
我們的組織希望散列大文件路徑以分配給特定對象。為了防止雜湊衝突,我認為我們可以使用與防止密碼雜湊中的彩虹表相同的技術。當您散列值“樣本數據”時,我們將首先添加一個 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 稍微批准您的算法。但即使有這種蠻力,這條路也是可行的。