Archive for the encrypt Category

Note: Password & Secure store method

Posted in encrypt with tags , , on 2014 年 11 月 13 日 by Kun-Yi

這幾天因為工作關係, 在重整某些從別處來的程式碼, 然後功能需求有一項是說 密碼不要明碼存在檔案內 (沒看錯, 本來的程式就是將密碼以明碼的模式寫入某個檔案內)

本來的想法是將password 經過某種代換方式 然後儲存, 如用某個 特定位元串 與密碼 做XOR, 移位, 查表對應等等運算 將密碼打亂. 實質上還是將密碼存在系統內了, 然後演算法也會因此在程式內, 有心人士很容易破解的 (如果有這種有心人的話 搭配IDA Pro 的工具是不難做到的 這種範例如早期很多軟體的密碼註冊碼 的演算法是寫死在內部 很容易就會出現註冊產生器 )

後來想到還是應用一下密碼學演算法好了, 想到的就是AES, 查了一下程式執行環境是 Win7 & later, OS 已經有內建的AES 128bits 演算法, 剩下的就是 AES 的Password (128bits) & IV(Initialization Vector) 的決定, IV 我就直接執行GuidGen 產生一組 GUID 來使用, 至於 Password 則是將使用者輸入的密碼 先做 Hash 這次用的是MD5 (沒錯就是很弱的MD5, 因為直接會變成128bits, 想要安全點的可以換SHA1, SHA256, SHA386 等等, 然後自己選定抽取其中的 128bits) 然後就可以用來當 AES Password 輸入, 然後使用針對某一個特定字串加密, 這樣會產出經過加密過的資料, 所以程式內(Source & Binary)可以找到的內容就是 IV 跟用來加密的特定字串, 該特定字串 我是選了幾個詩句, 如果這段程式碼之後會交接的話, 可以用來嚇嚇接手的人 :P, 然後要存在檔案內的就是經過加密後的資料, 沒錯 我們並不需要記得密碼本身

當需要做密碼驗證, 實際上只要把新輸入的密碼, 經過再一次加密看看是不是得到一樣的結果, 或是將輸入的密碼對加密過後的資料進行解密, 然後比對是否跟原本的特定字串相同即可!

另外如果想將加密的內容, 存入文字檔的話(因為該程式本來的明碼是文字格式 :P), 建議可以將加密內容經過 Base64/ASCII85 等, 轉換即可個人是採用修改過的 ZeroMQ (Base85)

我想這應該也是現在常見的俱備有密碼學常識的網站密碼系統的基本組成方式吧? 唯一不同的是選的演算法不同吧!

Update: 寫完這篇筆記 想來驗證一下是不是跟我想的一樣, 就用Google 找了一下, 發現這篇文章
https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/
基本思路是一樣的, 不過他還加了 Random String 的產生, 不過我的系統實際上是單一使用者系統, 沒有那種多個使用者 使用同一個密碼最後產生的加密資料會一樣的困擾, 要將我的程式, 改成類似的系統實際上只要把AES的 IV 改成每次都自動產生GUID 然後一樣存到檔案內即可!

IV/Random String 是動態產生並且存在檔案內的好處, 除了可以避免多使用者使用同一個密碼產生的一樣的加密內容外, 另外一個好處就是可以避免被人使用暴力破解, 如果被人得知演算法+IV等資料是可以透過平行運算等等方式, 透過預先計算的方法來暴力破解密碼, 使用一個動態產生的字串或是IV 等於加大了密碼的強度/長度