我生成一個由單個使用令牌組成的url,並通過電子郵件將其發送給用戶。用戶應該點擊這個鏈接並重定向到一個頁面,該頁面將驗證令牌並執行一些操作。存儲的鹽漬令牌和令牌比較
在數據庫方面,我存儲了這個令牌(出於安全原因散列和醃製)。問題是我在驗證令牌時遇到了一些困難,因爲我存儲它的方式不能爲同一標記生成相同的鹽。因此,我無法將這種鹽與我儲存的鹽進行比較。
# Retrieving or creating object usertokens
usr, created = UserToken.objects.get_or_create(email=email)
# Adding a new token
token = uuid.uuid4().hex
usr.token = make_password(token) # Stores in the local database the salted and hashed token
usr.save()
我使用的這個make_password方法定義在django.contrib.auth.hashers
中。
通過使用這種方法,我不能從相同的標記生成兩次相同的鹽。
>>> token = 'test'
>>> enc_token1 = make_password(token)
>>> enc_token2 = make_password(token)
>>> enc_token1 == enc_token2
False
但是,這並不能幫助我從我的數據庫檢索對應於令牌的條目,我無法驗證它。
現在有件事我從來沒有聽說過; _帶有鹽漬的標記_。你想用這些令牌來番茄醬嗎?...... –
除了所有的笑話外,散列和醃製的目的是不能從散列字符串中獲取原始密碼。由於密碼經常以某種方式重用,並且希望密碼在潛在違規後很長時間內保持祕密,所以需要密碼。令牌可以簡單地重置,然後攻擊者絕對不會使用獲取的令牌。正如您已經注意到的,沒有有效的方法來查詢鹽漬和散列的標記。這就是爲什麼令牌通常以純文本格式存儲的原因。爲了什麼特定的安全原因,你想存儲他們散列? – knbk