如果我已經有一個 44 個字元長的 AES 256 密鑰,我還需要 SHA256 嗎?
幾個月前,我被要求研究 AES 和 SHA-256 來為我的應用程序建立一個安全的許可系統。但是,我很愚蠢,無法區分來自 AES 的 256 位和實際的 SHA-256,這導致我製作了一個系統,為 AES-GCM 生成 256 位長密鑰(44 個字元長的 base64 密鑰)沒有實際 SHA-256 的加密和解密。現在,是時候更新與 PHP 中的 AES 系統協作的系統了。但後來我發現提供給我的 PHP 資源(它用於研究目的,因此可以更改)實際上使用了 SHA-256,這使得兩個系統完全不同。那麼我的問題是,256 位長密鑰是否足夠安全,以至於我實際上不需要 PHP 系統中的 SHA-256?
PS:如果我誤解了問題中的任何內容,我想道歉,因為我還是密碼學領域的新手……
PHP程式碼:
<?php echo '<pre>'; $hash_string = 'qIANSOwtdfF4y5Yk33ZLE5s6KwKBAeu6qzJRG84Sjjo='; echo "password : "; var_dump($hash_string); echo '<hr>'; $decode_string = base64_decode($hash_string); $hash = hash('SHA256', $decode_string, true); echo "hash : "; var_dump($hash); echo '<hr>'; $app_cc_aes_key = substr($hash, 0, 32); $cipher = 'aes-256-gcm'; $iv_len = openssl_cipher_iv_length($cipher); echo "app_cc_aes_key : "; var_dump($app_cc_aes_key); echo '<br>'; echo "cipher :"; var_dump($cipher); echo '<hr>'; $data = '7bc9d6ae-982f-11e9-bc42-526af7764f64'; echo "data : {$data}"; echo '<hr>'; $tag_length = 16; $iv = openssl_random_pseudo_bytes($iv_len); $tag = ""; $encrypt = openssl_encrypt($data, $cipher, $app_cc_aes_key, OPENSSL_RAW_DATA, $iv, $tag, "", $tag_length); $encrypt_text = base64_encode($iv.$tag.$encrypt); echo "encrypt :"; var_dump($encrypt); echo '<br>'; echo "encrypt_text :"; var_dump($encrypt_text); echo '<hr>'; $decoded_text = base64_decode($encrypt_text); $iv = substr($decoded_text, 0, $iv_len); $tag = substr($decoded_text, $iv_len, $tag_length); $ciphertext = substr($decoded_text, $iv_len + $tag_length); $decrypt_text = openssl_decrypt($ciphertext, $cipher, $app_cc_aes_key, OPENSSL_RAW_DATA, $iv, $tag); echo "decrypt_text : {$decrypt_text}"; echo '<hr>'; ?>
C#中生成AES密鑰的方法:
public string NewKey() { var key = new byte[KEY_BIT_SIZE / 8]; random.NextBytes(key); return Convert.ToBase64String(key); }
關於許可證系統:它在 Android 上。當應用首次打開時,應用會生成一個 UUID 並將其發送到伺服器進行授權。然後我們的工作人員會手動授權並發回授權碼。如果有程式碼,則該應用程序可以自動獲得使用我們員工安排的課程的許可。
你沒有說 SHA-256 在 PHP 系統中是如何使用的,所以真的沒有辦法知道它有多“安全”。據推測,SHA-256 被用作輸入密鑰材料的密鑰派生函式 (KDF),因此它是否提供任何額外的安全性將取決於輸入密鑰材料的來源。當然,SHA-256 不如 KDF 好——通常會使用 HKDF 之類的東西(例如,如 RFC 5869 中所述)。
生成 256 位長密鑰的系統
這是如何生成的,這將對您的方案的安全性產生重大影響。
如果它是由強加密隨機數生成器 (CSPRNG) 生成的,那麼通常認為在其上使用 KDF 是不必要的。
如果它是由 Diffie-Hellman 密鑰交換生成的,那麼在原始 DH 輸出上使用 KDF 很重要。
如果它以任何其他方式生成,無論是否使用 SHA-256,您的整個方案都可能不安全。
但這一切都基於對如何使用各種算法的猜測。
為了獲得更好的答案,您確實需要告訴我們您的許可系統的要求是什麼,執行緒模型是什麼(請注意,如果這是一個移動應用程序,它們被認為是在攻擊者擁有的不受信任的環境中執行完全控制,通常也使用各種混淆和白盒加密技術)和方案的細節。
我還是密碼學領域的新手
密碼學是“購買”而不是“建構”總是更好的領域之一——不要自己動手。