secrets — 生成用於密碼層級的亂數 — 你所不知道的 Python 標準函式庫用法 10

secrets – 生成用於密碼層級的亂數

The secrets module is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets.

Source code: Lib/secrets.py

secrets 模組的用意,是為了要在 Python 內提供一個適用於密碼層級的亂數產生機制,透過 secrets 我們可以輕鬆的產生密碼強度的亂數以及亂數選擇元素,從而避免使用者使用 random 模組來產生隨機亂數並將之用於密碼上。這個模組目前只在 Python 3.6 以後的版本才有,請各位更新到最新版本來使用。

01. Quickstart Tutorial

產生密碼強度的隨機亂數:

產生密碼強度的隨機字串

產生密碼強度的可用於 URL 的隨機字串:

以密碼強度的方式隨機選擇一個 Sequence 中的元素:

可以避免被使用旁通道時間攻擊的字串比較:

02. HOW-TO Guides

我不是 Python 3.6,可以使用這個模組嗎?

理論上不行,因為在 3.6 之前的 Python 沒有這個模組。請更新到 Python 3.6。

強烈建議更新到 Python 3.6,因為真的很好用。好東西要說三次:使用 Python 3.6、更新到 Python 3.6、請用 Python 3.6

我們可以打開 Python 3.6 Lib/secrets.py 的原始碼參看,其實就會發現這是一個 wrapper 類型的模組,裏面使用的技巧,都能夠向後相容的。如果你真的不能用 Python 3.6,從原始碼複製你需要片段就可以使用了。

如何產生含有至少3個大寫英文字母、剛好有兩個數字、有小寫字母、且長度為 10 的密碼?

如何產生字典式密碼?

如何產生很難猜測的臨時 URL ?

03. Discussions

由 Steven D’Aprano 在 2015 年 9  月 19 日發起的 PEP 506,目的在於提供 Python 一個與一般安全相關的亂數標準函式庫。發起的動機是因為考量到透過 Python 的標準函式庫,開發者很容易會以錯誤的方式使用亂數,進而引發安全性上的問題。Theo de Raadt,Open BSD 的 founder,就曾經連繫 Guido van Rossum 說明他對於使用 MT (Mersenne Twister,梅森旋轉算法,random 預設使用的隨機演算法) 在機敏資料,例如密碼、sesson key 以及相關事務上的疑慮。

雖然在 random 的官方文件上都有顯式的標記出「出於安全疑慮、請勿在密碼相關的領域上使用 random 模組」,但我們可以確信,這個警告幾乎被許多 Python 使用者忽略、無視、或是誤解。例如說:

  • 開發者並沒有閱讀文件,因此沒有看到警告;
  • 開發者並不知道自己的用法會造成安全疑慮;
  • 開發者沒有意識到問題的發生,他們可能複製了其他網站的程式碼 (或是學到) 錯誤的使用方式。

我們可以從 Google 搜尋驗證這些問題,在 Google 上搜尋 “Python how to generate passwords” 的第一個結果使用了 random 模組。雖然 random 模組並不是設計來使用於網頁程式,但是極有可能被遭到誤用。第二個驗證來自於 Stackoverflow,詢問如何產生密碼的問答中,許多答案使用了 random,而被接受的答案也是如此。提出使用 random 會有安全疑慮,還會被嗆”你想太多了”。

更多的資訊以及想法可以參考第一個提出想法的 mailing list

04. References

1 comments On secrets — 生成用於密碼層級的亂數 — 你所不知道的 Python 標準函式庫用法 10

Leave a reply:

Your email address will not be published.