簡體   English   中英

如何在安全(C ++)中存儲加密密鑰?

[英]How to store encryption key in safe (C++)?

我想在游戲中使用xxtea進行數據加密/解密。

這是庫用法的示例:

#include <stdio.h>
#include <string.h>
#include <xxtea.h>

int main() {
    const char *text = "Hello World! 你好,中國!";
    const char *key = "1234567890";
    size_t len;
    unsigned char *encrypt_data = xxtea_encrypt(text, strlen(text), key, &len);
    char *decrypt_data = xxtea_decrypt(encrypt_data, len, key, &len);
    if (strncmp(text, decrypt_data, len) == 0) {
        printf("success!\n");
    }
    else {
        printf("fail!\n");
    }
    free(encrypt_data);
    free(decrypt_data);
    return 0;
}

那么如何保證鑰匙本身的安全呢?

正如@ArtjomB指出的那樣,您可以通過不將密鑰放入程序中來保護密鑰的安全。 在啟動過程中,授權用戶或安全設備將需要提供密鑰。

看起來像這樣的東西不再是加密或安全性,而是某種形式的混淆。 混淆(或“ DRM”)可能會在無用之間有些有效,這取決於您要投入多少精力以及破解它的興趣。 隨着新攻擊的來臨,您目前在改善此方面的預算是多少? 您預期的攻擊者的技巧是什么?

蘋果公司(例如)非常嚴格地控制其硬件,固件和操作系統,並擁有一支專門致力於不斷改進的團隊。 iPhone通常在新版本發布后的幾周到幾個月內越獄。 您應該考慮針對有吸引力的目標的最佳方案。

如果您在想“好吧,那么我在下午可以采取什么措施來止住腳踝的酸痛?” 做任何想到的事情。 將其與其他一些硬編碼值進行異或。 也許將其移位或其他。 它不會對任何關心的人有太大幫助,但是它將阻止最隨意的攻擊者,至少您不會在它上面浪費大量的時間和金錢。

從那開始,請看一下平台的內置解決方案。 操作系統幫助是很大的幫助。 特別是,請查看Windows上的SLP服務 如果您通過Mac App Store工作,則Mac將提供許可執行。 或者,您可以看看擁有自己專有解決方案的商業供應商,例如eSellerate。 SafeNet有幾種產品 當然,所有這些都可以(並且經常)被擊敗。 但是它們比幾天后您將要開發的東西要強大得多。

從定義上講,您脫離StackOverflow的任何特定方法都是無用的。 造成混淆的唯一原因是其細節是秘密的。 如果您知道它是如何工作的,那么您可以擊敗它。 那就是它與加密的區別。 即使攻擊者知道整個算法,良好的加密設計也同樣強大。 這就是混淆技術是專有技術的原因。 他們幾乎是必須的。 這意味着您要么(a)快速建立一個糟糕的辦公室,(b)花大量時間和金錢建立一個稍差一些的辦公室,要么(c)花費更多的錢來獲得一些-來自專門從事這些事情的供應商的合格產品。

(如果您在StackOverflow上問這個問題,那么絕對沒有機會自己構建一個好的程序。如果您自己還沒有破解一些程序,那么您就無法構建任何東西來停止開發)其他。)

不能做 在大多數情況下,您可以做的是弄亂密鑰,打斷單詞,拆分,混合,移位,異或等,等等……以使其更難。 但是,沒有什么可以阻止非常有動機的黑客對您的代碼進行反向工程並獲得密鑰。

針對這種情況的最佳解決方案稱為“白盒加密”: https : //en.wikipedia.org/wiki/Obfuscation#White_box_cryptography

這個想法是一種生成針對您的加密的個性化二進制代碼,該代碼將whitebox_decrypt(cypher)替換為函數decrypt(cypher, key) ,二者均返回相同的結果。 第二個函數whitebox_decrypt不包含密鑰本身,而是一種個性化算法,其結果與原始解密函數相同。 再說一遍:它可以像所有東西一樣被逆向工程,但是它是如此的困難,以至於實際上並沒有激發任何人這樣做。

但是,這通常很昂貴。 我不知道免費有什么好東西。 它非常用於保護DRM內容。

最好的混淆方法是在運行時計算密鑰。 例如,您可以在“按任意鍵...”或“錯誤加載文件”之類的系統字符串上計算SHA1或MD5。 然后使用哈希作為XXTEA密鑰。

這不容易。 我前段時間也給出了類似的答案。 如果情況允許,您可以使用用戶輸入的密碼來加密密鑰,並將加密的密鑰存儲在某個地方。

然后,當您需要密鑰時,可以輸入密碼並解密並使用密鑰。

這樣,當您的密鑰以加密形式保存時,您不必擔心有人會知道它是什么。

加密密鑰是一個秘密 (這是一個技術術語,僅描述應該知道的人知道的東西)。

將秘密存儲在程序中等同於將其記錄在一張紙上,然后將其傳真給全世界的每個人。

即不再是秘密了。

將密鑰保密的方法是要求用戶輸入密鑰,然后在執行解密后刪除所有密鑰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM