2010-06-14 122 views
4

我知道如何在終端中使用GCC和CC編譯C和C++源文件,但是我想知道一旦編譯後它是否可以在這些文件中包含密碼。在已編譯的C或C++代碼中加密密碼

例如..我檢查用戶輸入的某個密碼,例如123,但它出現編譯的C/C++程序可能被反編譯。

有沒有辦法編譯C/C++源文件,同時保持源代碼完全隱藏。 如果不是,任何人都可以提供一個加密輸入的小例子,然後檢查密碼,例如:(SHA1,MD5 )

+0

有誰知道如何做到這一點與外部註冊服務器? – Daniel 2010-06-14 10:48:12

+0

您可以強制用戶連接到網站並檢查一些數據(密碼,密鑰等),或下載運行該應用程序所需的文件。 – INS 2010-06-14 11:07:58

+0

嗯,我將如何下載遠程文件並在C中執行它? – Daniel 2010-06-14 11:17:51

回答

3

不建議在代碼中保留任何敏感的靜態數據。你可以使用配置文件。你可以存儲你喜歡的任何東西。

但是,如果您真的想這樣做,請記住可以通過調試器進行調查並對其進行修改,從而輕鬆更改代碼。只有用戶無權訪問的程序可以被認爲是更安全的(例如網站)。

絕大多數(不同地點的)登錄密碼在數據庫中並未明確存儲,但是使用算法MD5,SHA1,Blowfish等加密。

我建議你從OpenSSL庫使用這些algorithms其中之一。

我會做的是使用一些public-key cryptographic algorithm。這可能需要更長的時間才能被破解,因爲在我看來,談論軟件保護時沒有100%的把握。

+0

感謝您的答案!,但我將如何實現sha1在c文件中? – Daniel 2010-06-14 11:02:12

+0

您使用Sha1的openssl實現:http://www.openssl.org/docs/crypto/sha.html – INS 2010-06-14 11:04:29

+0

太棒了!感謝您的幫助! :) – Daniel 2010-06-14 11:07:42

2

如果以純文本的形式存儲它們並不安全,則可以轉儲文件或使用字符串等實用程序在可執行文件中查找文本。

你將不得不以某種方式對它們進行編碼。

+0

謝謝,但我如何編碼他們? – Daniel 2010-06-14 09:30:21

+1

在這裏做一些搜索,有很多方法可以做到這一點。你可以從這裏開始。 http://stackoverflow.com/questions/1007337/encrypting-and-decrypting-a-small-file-using-openssl – Gary 2010-06-14 09:40:05

0

嘗試找出散列函數和加密方法來保護您的密碼及其存儲。

+0

謝謝,你能指點我一些樣品? – Daniel 2010-06-14 09:45:22

4

不,您不能在源文件中安全地包含密碼。可執行文件中的字符串爲純文本格式,任何具有文本編輯器的人都可以輕鬆查看您的密碼。

不太安全,但會踐踏一些人,而是存儲加密的字符串。所以,基本上:

enc = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4" 

bool check() { 
    pass = getPassFromUser(); 
    encpass = myHashingFunction(pass); 
    return pass == encpass; 
} 

這將阻止一些人,但是是不是真的更安全,這是比較瑣碎組裝黑客與另一SHA256編碼字符串替換「ENC」串在你的可執行文件一個已知的明文值。

即使您使用單獨的身份驗證服務器,也不難設置僞造身份驗證服務器並欺騙您的程序連接到此僞造身份驗證服務器。

+6

...或者只是總是返回'真' – 2010-06-14 10:01:07

+0

我會建議sha1加密,但我該怎麼做? – Daniel 2010-06-14 10:03:10

+0

該代碼可以很容易地修改,以使其返回真正的其他任何東西,但正確的密碼:) - 但至少它提供了一些保護(我正在討論在彙編級別的調試和修改) – INS 2010-06-14 10:53:11

1

這是一個可能幫助您的代碼示例,使用OpenSSL

#include <openssl/evp.h> 

bool SHA256Hash(const char* buf, size_t buflen, char* res, size_t reslen) 
{ 
    if (reslen >= 32) 
    { 
     EVP_MD_CTX mdctx; 

     EVP_MD_CTX_init(&mdctx); 

     EVP_DigestInit_ex(&mdctx, EVP_sha256(), NULL); 
     EVP_DigestUpdate(&mdctx, buf, buflen); 
     EVP_DigestFinal_ex(&mdctx, res, &len); 

     EVP_MD_CTX_cleanup(&mdctx); 

     return (len == 32); 
    } 

    return false; 
} 

我從systools圖書館拿了這個樣本,不得不去適應它。所以我不確定它沒有修改就編譯。但是,它應該可以幫助你。

請注意,要確定在您的二進制文件中是否存儲某個密碼的哈希值是安全的,我們必須知道您想要它。

如果你希望它禁止你的程序的某些功能,除非給出了一些特殊的密碼,那麼它是沒用的:攻擊者可能會刪除整個密碼檢查代碼,而不是試圖猜測或反轉存儲的密碼。

4

即使你使用SHA1來產生一個散列,如果你以正常的方式做它(寫一個函數來檢查密碼),它並不是真的那麼安全,任何確定的或知道的黑客可以訪問可執行文件將能夠解決它(用一個已知的散列替換你的散列,或者用一個返回true的調用替換checkPassword()調用。

問題是你想要保護誰?你的小兄弟,黑客,國際間諜,工業間諜?

使用SHA1與只包含在代碼(或配置文件)內的散列只會保護你的小弟弟嗎?(閱讀不能偶然的計算機用戶,不能被打擾嘗試和破解你的程序,而不是支付股票價格)。在這種情況下,使用純文本密碼或SHA1哈希值幾乎沒有什麼區別(可能有更多的人不會打擾)。

如果你想讓你的代碼對其他任何東西安全,那麼你需要做更多的事情。一本關於安全性的書是一個很好的起點,但唯一真正實現這一目標的方法是在安全課上教授保護技術。這是一個非常專業化的領域,滾動你自己的版本很可能會產生反作用,並且沒有真正的保護(使用散列只是第一步)。

+0

感謝您的迴應!,非常信息投票:) – Daniel 2010-06-14 13:10:40