Password-Based-Encryption

從序列號派生加密密鑰的最佳方法是什麼?

  • July 1, 2017

我有幾個執行我的應用程序的 Android 設備。每個設備都有自己唯一的序列號 - 一個 16 個字元長的十六進製字元串。

該應用程序需要文件,這些文件通常位於外部 SD 上。這些文件應該只能由它們打算用於的設備使用。所以我需要使用從序列號派生的唯一密鑰來加密這些文件。

現在的問題是:從序列號派生加密密鑰的最佳方法是什麼?我以為我可以將其反轉並將其用作某些雜湊函式的輸入。但我認為這很明顯……

根據某些資訊(例如您的序列號)製作密鑰的標準方法是使用密鑰派生函式 (KDF)。如果您不認為對序列號的暴力攻擊是現實威脅,那麼建議使用HKDF,否則您應該使用基於密碼的 KDF ,例如SCrypt,它的速度要慢得多(這對暴力破解是件好事)。

我覺得有必要補充一點,只使用序列號作為秘密不會給你一個安全的加密。雖然現在 16 個字節基本上足以阻止攻擊者,但必須假設序列號並不是真正隨機的,而是遵循某種模式,從而使它們更容易被猜到。因此,雖然如果您只是想防止意外誤用或被動攻擊者,這個方案是可以的,但對於主動攻擊者來說,它肯定不夠好。

在您對上述問題發表評論後更新:

SCrypt 在那種情況下不會幫助你,所以應該使用 HKDF 來派生對稱加密的密鑰(可能是 AES)。由於您顯然永遠不會與您的應用程序建立線上連接,因此也無法使用隨機鹽。您可以用來加強該過程的唯一額外秘密必須在您的應用程序中進行硬編碼,並受到一些程式碼混淆的保護。所有這些都將保護您免受只是將文件複製到不同設備的臨時文件共享者的侵害,而不是來自更活躍的任何人。

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