我有一個程式運行時需要從檔案中讀取一些保密的內容,如何對這些保密的內容進行加密以及如果在應用程式中安全的存盤這些密鑰,有什么最佳實踐可供參考嗎?
由于保密內容可能較大因此我理解應該使用AES加密保密內容,問題進而演變成如何安全的存盤AES密鑰。我計劃使用RSA私鑰加密AES密鑰,使用硬編碼在應用程式中的RSA公鑰來解密AES密鑰的密文。這種方式違反了公鑰加密私鑰解密的原則,但是如果硬編碼私鑰這會導致更大的問題。
我知道在應用程式中存盤密鑰沒有絕對的安全但總比什么都不做的好,也并不是每個人都有逆向的能力。我了解到還有加密狗這種硬體的方式但是這需要給應用程式額外配置一個硬體并不總是那么方便。
求各位大神支招



uj5u.com熱心網友回復:
只要你最終要把加密內容明文保存到記憶體里,就永遠不能防止有心人進行資料竊取。我個人認為,如果你上了(多層)加密,而且保持解密、資料的使用不太明顯,那么應該已經能勸退許多不想花太大功夫的人了。(然后再給程式上個殼,效果可能更好)uj5u.com熱心網友回復:
我也查了很多資料,密鑰硬編碼到程式中是沒有辦法保證安全的。這么做能擋住大部分的人其實就已經足夠。如果要絕對安全那么要付出的成本就太大了。我之前沒做過這樣的事情也不知道這樣是不是正常的做法。
uj5u.com熱心網友回復:
我有一種想法,就是把密鑰寫成一個回傳值的函式,把該函式編譯為機器碼,然后再你的解密函式里直接呼叫機器碼獲得密鑰再解密。機器碼呼叫的例子,可以參考以下帖子
https://blog.csdn.net/bdss58/article/details/83387028
uj5u.com熱心網友回復:
我覺得這樣不太好,因為這種代碼是需要呼叫系統 API 獲取執行權限的,逆向的時候都是重點關照物件,一旦 API 被除錯器 hook,很容易露餡,導致被破解。
uj5u.com熱心網友回復:
兩個問題:1 密鑰的加密存盤, 這個弄個大一點兒的資料區, 把密鑰簡單的可逆加密后, 分散開存盤到一堆亂碼當中就好了
甚至存盤到多個不同檔案里面去
密鑰的生成,可以根據一些硬體資訊來,確保機器碼或者用戶資訊和密鑰有唯一的匹配
這種加密演算法有很多, 看那類適合用哪一類就好了。核心問題還是生成一個唯一的用戶ID,和一個唯一對應的密鑰
把密鑰弄的長長的, 即便給予明文也不容易推算出關系,偽造密鑰難度還是比較大的
2 密鑰讀取后解密的演算法才是重點, 演算法被破解加密的手段就統統失效
簡單 if ( 驗證成功 ) 執行正常代碼。else。例外處理; 這種寫法,會直接毀掉前面所有的密鑰生成成果。
這個部分的解決方案就是把密鑰的解密程序分散到多個不同的先后執行的函式當中,和正常的應用代碼混合起來
每段代碼解密密鑰的不同部分, 防止被跟蹤可以限定代碼的執行時長, 甚至可以用匯編語言實作逆指令流防止被debug
可以檢測呼叫程式的父行程是系統還是debug工具
這里花費的精力越多,破解越難, 回應的代碼的維護也越難
因為正常業務的代碼也要不斷的升級改造, 他們改完了,你在原始碼的基礎上去嵌入自己的加密原始碼
那種直接在不影響業務正常編碼程式上面加殼的方法是可以簡化作業難度,但是也降低了破解的難度
讓密鑰解碼出來的資料成為程式正常執行所需的一些重要資料的初始化變數, 財務資料運算的一些常量也未嘗不是一個好辦法
沒有明顯的if else 和函式呼叫判斷, 但是它錯了, 業務執行就各種意外發生了
從這個角度去想辦法,比明文和密鑰之間的那些有限演算法上,會靈活很多
uj5u.com熱心網友回復:
從逆向的角度說說你的問題,
1.你的密文存在檔案中,那必然會讀到到記憶體中處理,就有兩個破解點,一個readfile,第二個讀取之后在密文上下記憶體訪問斷點,直接就可以找到你對密文處理的部分,進而反推到你的密文來源,并不是什么難事。
這方面你有兩個方面處理,第一密文添加混淆內容,第二個邏輯分散處理
2.你用AES演算法,那么基本上常用的庫,比如openssl里面的加密部分,或者crpyto這些加密之后的匯編碼也容易識別的,直接在庫的演算法入口斷點基本就可以確定演算法,再逆推引數來源。應對辦法:1.用靜態鏈接,2.增加花指令 3.善于利用例外處理改變正常的流程,比如自己制造例外,try{假的加密解密}catch{正常的加密解密部分}
3.就是加殼增加逆向難度,一般的殼就不用試了,只能勸退初學者
4.如果你的程式是C/S結構,是的話辦法還可以多點,如果是單機的就只是是技巧性的.
沒有絕對安全的加密,只是看逆向成本是否大于收益。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/151815.html
標籤:C語言
上一篇:一道C語言問題,關于函式呼叫問題
下一篇:一道C語言問題,關于函式呼叫問題
