[英]Translate Windows CryptoAPI Salt and Hash to PHP
我們有一個舊版應用程序,該應用程序使用Windows CryptoAPI的CryptoHashData函數創建Salt和Hash。 我們采用隨機字節字符串,應用哈希,然后再次使用CryptoHashData將哈希應用於第二個數據字符串。 這是代碼。 隨機密鑰被散列,然后再與秘密數據一起散列。
BYTE baKeyRandom[10] = {87,253, ...};
pszSecret = 'ABCDEF-G...';
::CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hSaveHash);
::CryptHashData(hSaveHash, baKeyRandom, (DWORD)sizeof(baKeyRandom), 0);
::CryptHashData(hSaveHash, (LPBYTE)T2CW(pszSecret), (DWORD)_tcslen(pszSecret) * sizeof(WCHAR), 0);
通過使用簡單的md5()函數對隨機字節字符串baKeyRandom進行哈希處理,我們已經能夠在PHP上重新創建第一步。 此哈希返回的值與:: CryptoHashData上的第一個哈希完全匹配。
$random = md5($random);
完全符合
::CryptHashData(hSaveHash, baKeyRandom, (DWORD)sizeof(baKeyRandom), 0);
我們還無法弄清楚CryptoAPI如何將緩沖區中的第一個哈希與第二個數據字符串組合在一起以進行哈希處理。
即我們如何重新創建第二步
::CryptHashData(hSaveHash, (LPBYTE)T2CW(pszSecret), (DWORD)_tcslen(pszSecret) * sizeof(WCHAR), 0);
我們嘗試了以下最明顯的方法:
$random = md5($random); followed by any of the below
$key = md5($random.$secret);
$key = md5($secret.$random);
$key = md5($random.md5($secret));
$key = md5(md5($secret).$random);
這些方法都不符合CryptoHashData(random)+ CryptoHashData(secret)中的值
有誰知道CryptoHashData如何將緩沖區中的兩個值組合在一起然后進行哈希處理? 有沒有人在其他平台上重新創建過這種可以用PHP復制的CryptoAPI hash + salt方法? 是的,我們知道這是不安全的,並且不用於密碼或PII。 我們希望擺脫這種古老而又不安全的方法,但是我們需要采取此過渡步驟,首先將原始加密轉換為PHP,以實現與現有已部署系統的互操作性。 任何幫助或指導,將不勝感激。
這是基於下面公認答案的最終工作代碼。
<?php
function main(){
$random = pack('c*', 22,194,253,.......);
$secret = pack('c*', 22,194,253,.......);
$hash = hash_init("md5");
hash_update($hash, $random);
hash_update($hash, $secret);
print(hash_final($hash));
}
main();
?>
您不能在PHP中使用md5()
函數來逐步更新哈希。 哈希算法的鏈接基於算法的內部狀態,而不是輸入。 當我們使用md5()
方法時,無法傳遞md5的內部狀態,因此無法進行漸進式更新。
您需要使用hash_init()
, hash_update()
和hash_final()
進行流哈希。 這是一個例子:
<?php
$hash = hash_init("md5");
$data1="ABCD";
hash_update($hash, $data1);
$data2="ABCD";
hash_update($hash, $data2);
print(hash_final($hash));
?>
此代碼結果將類似於您的Windows API調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.