1. 程式人生 > >室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

Python 3.6版本引入了一個名為secrets的新模組,用於生成強大而安全的隨機數。在本文中,我們將學習如何使用secrets模組來保護你的小祕密。

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

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

在Python 3.6之前,我們使用os.urandom()和random.SystemRandom類來加密安全隨機生成器。

secrets模組是一種CSPRNG,即強加密偽隨機數生成器,它用於生成在較注重安全性的應用程式中安全且有用的隨機數。

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

  • 生成隨機數
  • 密碼和OTP
  • 隨機令牌
  • 密碼恢復安全URL和會話金鑰

接下來,讓我們來看看如何具體使用secrets模組。

一、secrets.SystemRandom類

  • 使用作業系統提供的最高質量源生成隨機數的類。
  • 使用secrets.SystemRandom類可以實現random模組的所有功能。
  • 在secrets模組出現之前,我們通常使用random.SystemRandom來加密保護隨機資料。現在使用secrets模組也可以訪問同一個類,只需執行secrets.SystemRandom()。

下面的程式碼展示瞭如何使用secrets.SystemRandom類來生成安全隨機數:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

進群:548377875  即可獲取數十套PDF!從零到實戰的那種以及大量的學習資料哦!~

輸出結果:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

二、Python secrets模組中的常用函式

1. secrets.randbelow(n)

  • 使用secrets.randbelow函式可以生成安全整數。
  • 此函式返回[0,n]範圍內的安全隨機整數。這裡n表示上限。

例如,secrets.randbelow(10)將生成一個從0到10範圍內的隨機整數。

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

輸出結果:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

2. secrets.choice(sequence)

  • 此方法從非空序列返回安全的隨機選擇元素。
  • 這裡的序列可以是列表或字串。

例如:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

輸出結果:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

3. secrets.randbits(k)

  • 此函式返回帶有k個隨機位的安全無符號整數。
  • 此函式用於生成包含N位設定的隨機位掩碼(這與生成隨機整數不同,因為不保證其中設定了N位)。
  • 使用randbits生成的數字更安全。

它在位範圍內生成隨機整數:

k = 4表示從0到15的無符號整數。

k = 8表示從0到255的無符號整數。

k = 16表示從0到65,535的無符號整數。

我們來看看這個例子:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

輸出結果:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

三、使用secrets模組生成安全口令

secrets模組提供用於生成安全口令的函式,這對於應用程式生成重置密碼口令和難以猜測的URL是非常有用的。

secrets模組具有以下用於生成安全口令的函式:

1. secrets.token_bytes([nbytes=None])

返回包含位元組數的安全隨機位元組字串。如果未提供nbytes,則使用合理的預設值。

2. secrets.token_hex([nbytes=None])

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

3. secrets.token_urlsafe([nbytes=None])

返回一個安全的隨機URL安全文字字串,包含nbytes隨機位元組。使用此方法可生成安全且難以猜測的URL。

讓我們來看下面的這個例子:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

輸出結果:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

口令應該使用多少位元組?

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

我們還可以使用secrets.compare_digest(a, b)減少計時攻擊。為了降低計時攻擊的風險,祕密模組具有compare_digest(a, b)功能。如果字串a和b相等,則此函式返回True,否則返回False以降低計時攻擊的風險。

四、Secrets使用例項

在例項中,我們生成臨時密碼並在臨時難以猜測的URL上傳送此密碼,以便客戶可以使用此URL重置其密碼。

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

例:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

輸出結果:

 

室友天偷看我電腦!還帶著紙巾?我決定用Python保護我的祕密了!

 

 

以上便是我們今天分享的所有內容。如果您知道實現類似功能更好的做法,歡迎評論。