當前位置:
首頁 > 知識 > Python Secrets:生成用於管理機密的安全隨機數

Python Secrets:生成用於管理機密的安全隨機數

Python Secrets:生成用於管理機密的安全隨機數

打開今日頭條,查看更多精彩圖片

Python 3.6引入了一個名叫secrets的模塊,用於生成強大而安全的隨機數。在本文中,我們將學習如何使用它。

隨機模塊提供的隨機生成器是偽隨機數生成器,它不具有加密安全性,因此在Python 3.6及更高版本中添加了secrets模塊。

加密安全隨機生成器使用同步方法生成隨機數據,以確保沒有兩個進程可以同時獲得相同的數據。

在Python 3.6之前,我們用os.urandom和random.SystemRandom類加密地使隨機數發生器安全。

注意:secrets模塊僅在Python3.6以及更高的版本中可以獲得。如果你正在使用Python的舊版本,而卻想要使隨機生成器安全,請參考:https://pynative.com/cryptographically-secure-random-data-in-python

secrets模塊是CSPRNG,即加密性強偽隨機數發生器(cryptographically strong Pseudo-Random Number Generator)。它被用來生成隨機數,在對安全敏感的應用程序中是安全和有用的。

請參閱PEP-0506。此PEP旨在將secrets模塊添加到Python標準庫中。

您可以使用secrets模塊來執行以下常見的安全相關功能:

  • 生成隨機數

  • 密碼和一次性密碼(OTP即One Time Password)

  • 隨機token

  • 密碼恢復安全URL和會話密鑰

注意:secrets模塊基於os.urandom和random.SystemRandom, 它們是操作系統最好的加密隨機性源碼的介面。

  • 在Windows上,os.urandom在內部使用CryptGenRandom

  • Linux 3.17及更新版本,getrandom系統調用現在可以使用

  • 在OpenBSD 5.6及更高版本中,現在使用C getentropy函數

下面讓我們來看如何使用secrets模塊。

類secrets.SystemRandom

  • 使用操作系統提供的最高質量源來生成隨機數的類

  • 使用secrets.SystemRandom類我們能使用所有的random模塊的功能

  • 在secrets模塊之前,我們使用random.SystemRandom去加密地使隨機數據安全。使用secrets模塊也可以使用同樣的類。僅需執行secrets.SystemRandom

讓我們看一下如何使用secrets.SystemRandom類來保護隨機生成器的示例:

示例:

Python Secrets:生成用於管理機密的安全隨機數

輸出:

Python Secrets:生成用於管理機密的安全隨機數

Python Secrets模塊的功能

Secrets模塊使用底層操作系統的安全隨機源。讓我們看如何使用secrets模塊的功能。

secrets.randbelow(n)

  • 使用secrets.randbelow函數生成安全的整數

  • 這個函數返回一個在[0,n)區間的安全隨機整數,n是唯一的上限

  • 0是範圍的開始數字,n是最後的數字

  • 例如,secrets.randbelow(10)將生成一個從0到10的單個隨機數

示例:

Python Secrets:生成用於管理機密的安全隨機數

輸出:

Python Secrets:生成用於管理機密的安全隨機數

secrets.choice(sequence)

  • 此方法從非空序列返回安全的隨機選擇元素

  • 這裡的序列可以是列表或字元串

示例:

Python Secrets:生成用於管理機密的安全隨機數

輸出:

Python Secrets:生成用於管理機密的安全隨機數

secrets.randbits(k)

  • 此方法返回帶有k個隨機位的安全無符號整數

  • 此函數用於生成包含N位的隨機位掩碼(這不同於生成隨機整數,因為在這裡不保證生成的數固定包含幾個比特位,而是比特位由你決定)

  • 使用randbits生成的數字更安全

它生成在給定bit範圍內的隨機整數

  • 如果k=4,無符號整數從0到15

  • 如果k=8,無符號整數從0到255

  • 如果k=16,無符號整數從0到65535等等

示例:

Python Secrets:生成用於管理機密的安全隨機數

輸出:

Python Secrets:生成用於管理機密的安全隨機數

使用secrets模塊生成secure token

secrets模塊提供用於生成secure token的功能,這對於應用程序生成reset password tokens和hard-to-guess URL是有用的。

secure 模塊有如下方法生成secure token

  • secrets.token_bytes([nbytes=None])

    返回包含位元組數的安全隨機位元組串。如果沒有提供nbytes ,則使用合理的默認值。

  • secrets.token_hex([nbytes=None])

    返回一個十六進位格式的安全隨機文本字元串。該字元串具有nbytes隨機位元組,每個位元組轉換為兩個十六進位數字。如果沒有提供nbytes,則使用合理的默認值。

  • secrets.token_urlsafe([nbytes=None])

    返回一個安全的隨機URL-safe文本字元串,包含nbytes隨機位元組。使用此方法生成安全的hard-to-guess URLs。

示例:

Python Secrets:生成用於管理機密的安全隨機數

輸出:

Python Secrets:生成用於管理機密的安全隨機數

tokens使用多少位元組

為了抵禦蠻力攻擊和時序攻擊,tokens需要具有足夠的隨機性。根據專家的說法,32位元組(256位)的隨機性足以抵禦蠻力攻擊。您應該根據您的要求選擇位元組大小。

使用secrets.compare_digest(a,b)減少時序攻擊

為了降低時序攻擊的風險,secrets模塊具有compare_digest(a,b)功能。如果字元串a和b相等,則此函數返回True,否則返回False以降低計時攻擊的風險。

secrets模塊的練習示例

我們現在看看這個例子,此示例中,我們生成臨時密碼並在臨時hard-to-guess URL上發送此密碼,以便客戶端可以使用此URL重置其密碼。

  • 生成一個十個字元的字母數字密碼,至少包含一個小寫字元,至少一個大寫字元,至少一個數字和一個特殊字元

  • 生成臨時URL

示例:

Python Secrets:生成用於管理機密的安全隨機數

輸出:

Python Secrets:生成用於管理機密的安全隨機數

英文原文:https://pynative.com/python-secrets-module/
譯者:恩 澤

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

快速訪問4GB詞典向量:LMDB 嵌套
報告顯示:Python是黑客的首選語言

TAG:Python部落 |