2021/06/19

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

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

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

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

前幾天在 PTT 看到有網友分享類似的概念,但是他是用 MD5 產生密碼,好處是祇要電腦能上網,馬上就能找到計算 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/每個人都有個大腦』計算 SHA512,得到結果為:

9b557b14bf89abf17953e464e523cdcc0516a1a225911833154f416d6a645eaef514c08f14786a173980381ac2946c878e6bac6377e606e529c3eeb400f64a76

字串一再加上 SHA512 結果抽取前後各 4 碼,得到的密碼為 1A2b9b554a76

計算 Facebook 密碼

Facebook 網址: https://www.facebook.com/ ,加上字串二,以『https://www.facebook.com/每個人都有個大腦』計算 SHA512,得到結果為:

ec58a8a71f61ace5ceb7ce4d8c5ed09e647aa2dc1bf2041db08d8d5a10278ec67858cfcc0d0af9489d86c99c45449847b40d8b160f30ea9283bfced17ddbc309

字串一再加上 SHA512 結果抽取前後各 4 碼,得到的密碼為 1A2bec58c309

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

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

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

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

剛剛找到一個 Excel 檔,完全不需要 VBA,可以直接計算 MD5。把這個 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)

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

2 則留言:

  1. 雜湊值是一連串的位元組
    如果把它看成是 256 進位的數字
    接著轉換為 N 進位數字
    就可以把原本的雜湊值映射到有 N 個元素的字元陣列
    讓同樣長度的密碼有更多的變化


    我有做可離線使用的 html 檔案
    除了實作前面所述的內容
    也考慮到在公共場所可以使用的方式
    細節可參考
    https://gist.github.com/ren1244/9bf5359543841a115325afd7e133949a

    回覆刪除
  2. 利用進位轉換(例如 256 進位轉 62 進位)
    可以把雜湊值轉換為指定的字元集合

    我有做可離線使用的 html 檔案
    除了實現上述功能
    也考慮到公共場所能使用的方式
    細節可參考
    https://gist.github.com/ren1244/9bf5359543841a115325afd7e133949a

    回覆刪除