# 利用 MD5、SHA512 設定安全又好記的密碼

By [Yukie](https://paragraph.com/@yukie) · 2022-03-27

---

我以前是用密碼軟體亂數產生密碼，但是祇要一離開我的電腦我就廢了，因為那些密碼我根本不可能記住，祇能靠密碼軟體來記。

後來採取另一種做法，就是在 Excel 寫一個雜湊函數，將不同網站的網址，加上一段固定的字串去做雜湊計算就可以得到密碼。

這樣就算在外面用別人的電腦，不知道自己的密碼，沒關係，開啟 Excel ，把腦海裡的雜湊函數公式輸入 Excel ，馬上可以計算出密碼來。

前幾天在 PTT 看到有網友分享類似的概念，但是他是[用 MD5 產生密碼](https://www.ptt.cc/bbs/EZsoft/M.1622469426.A.15D.html)，好處是祇要電腦能上網，馬上就能找到計算 MD5 的小軟體幫忙計算密碼。

ㄟ，對齁，我幹嘛自己寫雜湊公式？才轉換兩三次，有心人要反推也太簡單；寫的太麻煩自己又記不住，直接用 MD5 或複雜一點的 SHA512 就好了啊，到處都有得用，根本不用擔心忘記。

利用 SHA512 產生密碼
--------------

底下介紹 PTT 網友產生密碼的方法，祇不過改成 SHA512 來做計算。

如果你要設一個 12 碼的密碼，可以將這 12 碼拆成 6+6 碼的兩部份，分別從 SHA512 的計算結果前 6 碼 & 後 6 碼獲得。但是這樣有個問題，就是 SHA512 結果的前 6 碼 & 後 6 碼有全都是數字(或都祇有英文字) 所以這方法要修改一下。

將原字串加點鹽
-------

修改的方式是將 12 碼拆成 4+8 兩部份，後面的 8 碼由 SHA512 結果的前 4 碼與後 4 碼組成。但是這還是沒有解決 SHA512 結果的前後幾碼可能都是數字或是全都英文字的問題，所以最開始的 4 碼我們要自己設計一下，讓這 4 碼包含英文(而且有大小寫) & 數字，比方 1A2b 這樣 (原作者是用元素英文 + 原子序)。

這樣一來，就算後面的 8 碼全都是數字，或者全都是英文也不用擔心了，反正加上我們一開始自設的 4 碼就能滿足大多數網站的密碼需求。

但是這樣還是有個問題，就是很多網站的網址早就有人計算過 SHA512 或 MD5，從這裡面抽取一部份來當密碼很容易被比對出來，所以我們需要在網址上面加點料再下去做 SHA512 計算 (這種方法稱為**加鹽**)。

如果你在網址之外還加了一段祇有你自己才知道的字串才去計算 SHA512，別人就算知道你用 SHA512 算密碼，但祇要不知道你的字串，他就沒辦法得到相同的密碼。

要加什麼料呢？其實都可以，你高興就好，加中文字也沒關係，字串長短也沒有什麼要求，祇要記得住就行。因為即便是一個字元的不同，計算出來的 SHA512 值也會完全不同，所以開心、記得住就好。

要用 SHA512 計算密碼的事先準備
-------------------

總結一下剛剛所說的內容。

首先，你要準備兩個字串，這兩個字串是你自己要記得的密碼，不要讓別人知道。

字串一 (前 4 碼)：兩個字母加上兩個數字，字母要有大小寫；再來要準備字串二(鹽巴)，用來與網址共同進行 SHA512 計算，避免密碼太好猜。

假設我的兩個字串如下：

    字串一 (前 4 碼)：1A2b
    字串二 (鹽巴)：每個人都有個大腦
    

計算 Gmail 密碼
-----------

Gmail 網址： [https://gmail.com/](https://gmail.com/) ，加上字串二，得到：『 [https://gmail.com/每個人都有個大腦](https://gmail.com/%E6%AF%8F%E5%80%8B%E4%BA%BA%E9%83%BD%E6%9C%89%E5%80%8B%E5%A4%A7%E8%85%A6) 』，以這個字串執行 SHA512 計算，得到結果為：

    9b557b14bf89abf17953e464e523cdcc0516a1a225911833154f416d6a645eaef514c08f14786a173980381ac2946c878e6bac6377e606e529c3eeb400f64a76
    

將 SHA512 計算結果抽取前後各 4 碼，最前方再加上字串一，得到的密碼為 1A2b9b554a76

計算 Facebook 密碼
--------------

Facebook 網址： [https://www.facebook.com/](https://www.facebook.com/) ，加上字串二，得到結果為：『 [https://www.facebook.com/每個人都有個大腦](https://www.facebook.com/%E6%AF%8F%E5%80%8B%E4%BA%BA%E9%83%BD%E6%9C%89%E5%80%8B%E5%A4%A7%E8%85%A6) 』，再以此計算 SHA512，得到結果：

將 SHA512 計算結果抽取前後各 4 碼，最前方再加上字串一，得到的密碼為 1A2bec58c309

這樣的好處是祇要記得兩個字串，就算用別人的電腦也可以立即計算出密碼來。

不過在網路上計算密碼不太安全，最好是能夠離線計算，但要下載那些 MD5、SHA512 計算小程式，又怕電腦主人有意見，那可不可以在 Excel 裡面計算就好？

很不幸，Excel 沒有相關函式可以用，得用 VBA。

『什麼？要開 VBA？會不會有危險？』嗯，電腦主人可能還是會有這個疑慮……

剛剛找到一個 Excel 檔，[完全不需要 VBA，可以直接計算 MD5](https://tzamtzis.gr/2017/web-analytics/excel-function-md5-hashing-without-vba/)。把這個 Excel 檔放在一個地方，隨時可以下載來計算密碼，也不需要開 VBA，沒有任何需要擔心害怕的地方。

雖然 MD5 在很早之前就被發現無法防止碰撞攻擊，但是個人使用來算個密碼還是 OK 的。

利用 Python 計算
------------

如果電腦中有 Python 的話，那就更簡單了，Python 原本就有 MD5、SHA512 函數，直接引用函數就好了：

      1 import hashlib
      2 
      3 def md5_gen(str):
      4     m = hashlib.md5()
      5     m.update(str.encode())
      6     return m.hexdigest()
      7     
      8 fourNum = input("請問前 4 碼：")
      9 secretStr = input("請問秘密字串：")
     10 webSite = input("要設密碼的網站：")
     11 
     12 rMD5 = md5_gen(webSite + secretStr)
     13 passMD5 = fourNum + rMD5[0:4] + rMD5[-4:]
     14 
     15 print(passMD5)
    

希望這樣子能讓大家設定一些既安全，又方便使用的密碼。

---

*Originally published on [Yukie](https://paragraph.com/@yukie/md5-sha512)*
