📌 置頂: 請把任何比你弱勢的用路人當作你的至親對待。跟前車保持安全車距 (2秒以上)。

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

In

,

Tags:



by

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


Comments

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

  1. […] token,請使用 secrets 模組,絕對不要使用 random […]

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.