Re: [問題] 如何寫出符合安全的C/C++ code

看板C_and_CPP作者 (順風相送)時間8年前 (2016/04/07 12:03), 8年前編輯推噓7(7017)
留言24則, 8人參與, 最新討論串2/3 (看更多)
※ 引述《Clangpp (Clang++)》之銘言: : 另外還看到很多新手居然把重要參數寫在 #define (preprocessor)中... : (同事的說法 因為編成binary後還是明碼 : 甚至可以直接開檔改 所以建議重要參數不要放在 preprocessor) 突然想到一個方便的小實驗可以驗證上面這個說法, 寫這樣一段小程式: #include <stdio.h> const char *password = "CrystalBall"; int main(void) { printf("Password = %s\n", password); return 0; } 和 #include <stdio.h> #define PASSWORD "CrystalBall" int main(void) { printf("Password = %s\n", PASSWORD); return 0; } 把他們 compile 成執行檔(假設叫 a.out),然後用這指令: strings a.out | grep 'CrystalBall' 試試看不同的方法,哪一種可以讓簡單的文字搜尋指令搜尋不到... 這樣不用反組譯也可以快快樂樂看見密碼~~~ 如果你有 binary editor (vim -b 就辦得到) 也可以用 editor 開啟檔案搜尋。 -- 桃樂絲: 可是, 如果你沒有頭腦, 為什麼會說話? 稻草人: ㄝ, 我也不知... 但是有些人沒有頭腦也能說超~多話呢。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.137.4.14 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1460001796.A.309.html

04/07 12:30, , 1F
感謝!!! 只是我要更正一下 const是我自己以為 同事並沒說
04/07 12:30, 1F

04/07 12:30, , 2F
他只說不要把密碼寫在#define中而已
04/07 12:30, 2F

04/07 12:58, , 3F
沒關係,你可以問他那到底該怎樣寫,再驗證他的作法 XD
04/07 12:58, 3F

04/07 17:39, , 4F
若須在程式儲存這種資訊,有沒有比較難被黑出來的方法?
04/07 17:39, 4F
要儲存就絕對會被挖出來。像樓下那樣不儲存,只驗證,才比較實際點。

04/07 18:11, , 5F
通常會用個one-way hash再compare hashed value?
04/07 18:11, 5F

04/07 18:19, , 6F
像Unix /etc/shadow只儲存密碼的md5sum
04/07 18:19, 6F

04/07 18:22, , 7F
當然,現在md5 collision太容易了,也有rainbow table
04/07 18:22, 7F
在適合的應用上,這招是正解。你提出的瑕疵,可以補強。我過陣子再回文細說。 MD5 不要用了啦,如果要用常見的演算法,挑 SHA-2 家族或 SHA-3 比較好。 http://www.larc.usp.br/~pbarreto/hflounge.html 不說也猜得到,骷髏頭不能用,紅十字殘血不推薦,放大鏡是受過攻擊仍然健在。 (SHA-2 家族指 SHA-224, SHA-256, SHA-384, SHA-512 這四款)

04/07 18:50, , 8F
我試過IDA還是有辦法分析出來XD
04/07 18:50, 8F
可以跟大家分享一下 IDA 這個工具嗎?

04/07 18:58, , 9F
如果只是要防grep等級的窺看,化整為零把密碼拆成字元
04/07 18:58, 9F

04/07 18:59, , 10F
再用程式runtime把字元組起來,這樣text section不會有
04/07 18:59, 10F
你的方法就是密碼學說的 confusion & diffusion 兩種方法之 diffusion (錯位) 至於 confusion 怎麼做呢? 產生一串和 password 一樣長的亂碼,xor 上去即可。 為了再還原出原始的 password 明文,錯位的排法、xor 的遮罩都要保留下來, 也因此這樣做也只能防簡單的 grep,仔細去看還是可以掘出解碼的方法。 ***** 所有的雙向加解密演算法都一樣 ***** 我管你是用 AES 還是 RSA,反正只要鑰匙藏在踏墊下都沒用。

04/07 19:00, , 11F
哦哦這篇重點在直接搜binary
04/07 19:00, 11F
主要是要讓他拿去吐槽他同事 XD 順便讓原 PO 思考一下這個問題,所以才限制一下怪物等級,當作地下城第一層。 ※ 編輯: Schottky (220.137.4.14), 04/07/2016 20:47:37

04/07 21:19, , 12F
原來用hash是方法之一,長知識了,不過askacis大說的
04/07 21:19, 12F

04/07 21:20, , 13F
方法能不能在動態分析的時候收割組合回來的結果呢?
04/07 21:20, 13F

04/07 21:30, , 14F
小弟學習了QQ 總之 code當中盡量不要放明文
04/07 21:30, 14F

04/07 21:32, , 15F
hash只適合用在驗證,若需要使用password明文就不適用了
04/07 21:32, 15F

04/07 21:32, , 16F
動態分析可以呀,甚至你在debugger設個斷點都可以收割
04/07 21:32, 16F

04/07 21:33, , 17F
我本身研究所領域是做key agreement protocol的 所以平
04/07 21:33, 17F

04/07 21:34, , 18F
時只會去注意網路或是IPC間的傳輸如何做比較安全
04/07 21:34, 18F

04/07 21:34, , 19F
沒想到 coding本身也那麼多要注意阿QQ
04/07 21:34, 19F

04/07 21:40, , 20F
目前也只討論到安全協定,沒講到實作coding部份啊
04/07 21:40, 20F

04/07 21:40, , 21F
coding真的建議看一下我說的那本書
04/07 21:40, 21F

04/07 21:41, , 22F
只是你玩線上遊戲,我們現在玩的是單機而已 XD
04/07 21:41, 22F

04/07 23:05, , 23F
推 長知識了 這串真棒
04/07 23:05, 23F

04/08 16:59, , 24F
長知識
04/08 16:59, 24F
文章代碼(AID): #1N1Tm4C9 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1N1Tm4C9 (C_and_CPP)