Aes

如果我已經有一個 44 個字元長的 AES 256 密鑰,我還需要 SHA256 嗎?

  • March 19, 2021

幾個月前,我被要求研究 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,您的整個方案都可能不安全。

但這一切都基於對如何使用各種算法的猜測。

為了獲得更好的答案,您確實需要告訴我們您的許可系統的要求是什麼,執行緒模型是什麼(請注意,如果這是一個移動應用程序,它們被認為是在攻擊者擁有的不受信任的環境中執行完全控制,通常也使用各種混淆和白盒加密技術)和方案的細節。

我還是密碼學領域的新手

密碼學是“購買”而不是“建構”總是更好的領域之一——不要自己動手

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