密碼是一種最常用來驗證身份的機制,例如在登入使用者帳號時,常會搭配密碼一起輸入,以確保存取這個帳號的人是帳號的擁有人或是代理人。由於密碼就像是身份證一樣的東西,因此不能太簡單,太簡單就會容易被人猜到,或是被電腦程式破解。在撰寫程式的時候,我們常會需要檢查、驗證及儲存使用者輸入的密碼,或是產生出密碼以供使用者或是系統本身使用。若是使用Rust程式語言的話,要如何處理密碼的相關功能呢?



Passwords

「Passwords」是筆者開發的套件,提供四大功能:密碼產生(Generator)、密碼雜湊(Hasher)、密碼分析(Analyzer)和密碼評分(Scorer)。

Crates.io

https://crates.io/crates/passwords

Cargo.toml

passwords = "*"

使用方法

密碼產生

使用「use」關鍵字來將「passwords」這個crate底下的「PasswordGenerator」結構體給引用到當前的程式範圍下。「PasswordGenerator」結構體擁有以下幾個欄位,可以控制其實體產生密碼的規則:

  • length:密碼長度。
  • numbers:是否要包含數字(123456789)。(不包含0)
  • lowercase_letters:是否要包含小寫英文字母(abcdefghjkmnpqrstuvwxyz)。(不包含i, l, o)
  • uppercase_letters:是否要包含大寫英文字母(ABCDEFGHJKMNPQRSTUVWXYZ)。(不包含I, L, O)
  • symbols:是否要包含符號(!@#$%^&*()+_-=}{[]:;"/?.><,~)。
  • strict:是否每種啟用的字元都要包含。

由於0、O、o和i、l、I、L很像,所以就沒有包含進來。「PasswordGenerator」結構體產生出來的實體有兩個方法,「generate_one」方法會產生出一組密碼,「generate」會產生出多組密碼。

舉例來說:

密碼雜湊

若需要將密碼雜湊之後儲存下來,可以啟用「Passwords」套件的「crypto」特色,「Cargo.toml」設定檔的寫法如下:

「crypto」特色啟用之後,就可以使用「use」關鍵字來將「passwords」這個crate底下的「hasher」模組給引用到當前的程式範圍下。「hasher」模組有3個函數,「gen_salt」函數可以產生出16個位元組的鹽,「bcrypt」函數可以利用「bcrypt」演算法來計算密碼明文的雜湊值,「identify_bcrypt」函數可以用來判斷一個密碼明文在雜湊之後是否和一個已知的bcrypt雜湊值是吻合的。

舉例來說:

密碼分析

使用「use」關鍵字來將「passwords」這個crate底下的「analyzer」模組給引用到當前的程式範圍下。「analyzer」模組有一個函數,那就是「analyze」函數。這個「analyze」函數可以輸入一組密碼,將其分析之後會回傳「analyzer」模組下的「AnalyzedPassword」結構實體。這個「AnalyzedPassword」結構實體所帶的密碼分析結果欄位如下:

  • password:移除ASCII控制碼之後的密碼明文。
  • length:密碼中所有字元的數量。
  • spaces_count:密碼中空白字元的數量。
  • numbers_count:密碼中數字的數量。
  • lowercase_letters_count:密碼中小寫英文字母的數量。
  • uppercase_letters_count:密碼中大寫英文字母的數量。
  • symbols_count:密碼中符號的數量。
  • other_characters_count:其它如中文字的字元。
  • consecutive_count:連續重覆出現的字元數量。
  • non_consecutive_count:不連續重覆出現的字元數量。
  • progressive_count:照順序出現的字元數量。

舉例來說:

如果想要判斷密碼是不是在常用不安全密碼的清單內,可以啟用「Passwords」套件的「common-password」特色,「Cargo.toml」設定檔的寫法如下:

「common-password」特色啟用之後,「AnalyzedPassword」結構實體就會多出「is_common」方法可以使用。若「is_common」方法回傳「true」,表示該密碼是非常危險的!

密碼評分

使用「use」關鍵字來將「passwords」這個crate底下的「scorer」模組給引用到當前的程式範圍下。「scorer」模組有一個函數,那就是「score」函數。這個「score」函數可以傳入一個,「AnalyzedPassword」結構實體的參考,來計算其所表示的密碼的分數,分數會直接以f64型別的數值來回傳。

舉例來說:

不同分數區間的涵意如下:

  • 0 ~ 20:非常危險。(有機會在數秒內就被破解)
  • 20 ~ 40:危險。
  • 40 ~ 60:很弱。
  • 60 ~ 80:弱。
  • 80 ~ 90:好。
  • 90 ~ 95:強。
  • 95 ~ 99:很強。
  • 99 ~ 100:極強(堅不可破)。