Sha-256

Python 中的構造 sha256(uuid4 + now) 對意外碰撞的敏感性如何?

  • March 27, 2016

我需要 32 字節的偽隨機序列來表示唯一的文件名,並且目前正在使用這個 Python 程式碼:

import base64
import hashlib
from django.utils import timezone
from uuid import uuid4

def get_name():
   data = str(uuid4()) + str(timezone.now())
   hash = base64.b64encode(hashlib.sha256(
                 data.encode()).digest(), '-_'.encode()).decode()[:-1]

您是否認為有必要檢查生成的序列是否與任何先前生成的序列不衝突,或者我可以跳過檢查的成本,信任函式嗎?

您可以跳過測試,除非您懷疑uuid4()) + str(timezone.now()(以及您可能添加的隨機值)可能不是唯一的。SHA-256 本身意外引入衝突的可能性微乎其微。

除了長度擴展攻擊之外,沒有已知的破壞算法的 SHA-256 攻擊。但是,這些似乎與您的協議無關。

因此,您主要需要擔心攻擊者會弄亂您的輸入。該日期不會增加太多熵,因此只要底層隨機生成器是安全的,您的方案也可能是安全的。


儘管您目前的方案似乎沒有問題,但您應該確保散列函式的輸入不依賴於輸入數據的大小。例如,A | BC將保存值散列為AB | C. 換句話說,您需要一種編碼資料結構的規範方法。最好記錄下來,否則你可能會在以後搞砸你的計劃。

引用自:https://crypto.stackexchange.com/questions/33972