Python3 os.urandom() 用于密码盐
Python3 os.urandom() for password salts
我想用 os.urandom()
生成密码盐。
然后创建一个散列:
hashed_pw = hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), 300000)
这很好用,但我还想存储散列和盐以在退出程序后登录。
我目前使用 csv 文件存储 password/salt。
如果我现在读取带有 csv.DictReader
的用户名的数据,则 salt 的类型为 str。
如果现在比较哈希,它不起作用,因为哈希算法需要一个字节。
如果我使用 salt.encode()
它现在是一个字节但与原始字节不同。
我怎样才能解决这个问题?
如果我只是生成一个随机字符串并保存到 csv 中,然后在哈希函数中对两者进行编码,我只会让它工作。
但我认为使用 os.urandom
作为盐更安全。
感谢任何帮助:)
在 bytes
对象上使用 .hex()
以获得适合 CSV 的 str
值,并在该 str
上使用 .fromhex()
以获得 bytes
再次:
import os
import hashlib
password = "mysecurepassword"
salt = os.urandom(10) # returns bytes
hashed_pw = hashlib.pbkdf2_hmac('sha256','password'.encode(),salt,300000)
hexpw = hashed_pw.hex()
hexsalt = salt.hex()
print(hexpw,hexsalt) # suitable for CSV
pw2 = bytes.fromhex(hexpw)
salt2 = bytes.fromhex(hexsalt)
assert(hashed_pw == pw2)
assert(salt == salt2)
输出:
e6134156ba833d22c30d4e387103505727232f74905b3a3119bd4b6d121cbff4 97181907f5f1a5b61d8c
我想用 os.urandom()
生成密码盐。
然后创建一个散列:
hashed_pw = hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), 300000)
这很好用,但我还想存储散列和盐以在退出程序后登录。
我目前使用 csv 文件存储 password/salt。
如果我现在读取带有 csv.DictReader
的用户名的数据,则 salt 的类型为 str。
如果现在比较哈希,它不起作用,因为哈希算法需要一个字节。
如果我使用 salt.encode()
它现在是一个字节但与原始字节不同。
我怎样才能解决这个问题?
如果我只是生成一个随机字符串并保存到 csv 中,然后在哈希函数中对两者进行编码,我只会让它工作。
但我认为使用 os.urandom
作为盐更安全。
感谢任何帮助:)
在 bytes
对象上使用 .hex()
以获得适合 CSV 的 str
值,并在该 str
上使用 .fromhex()
以获得 bytes
再次:
import os
import hashlib
password = "mysecurepassword"
salt = os.urandom(10) # returns bytes
hashed_pw = hashlib.pbkdf2_hmac('sha256','password'.encode(),salt,300000)
hexpw = hashed_pw.hex()
hexsalt = salt.hex()
print(hexpw,hexsalt) # suitable for CSV
pw2 = bytes.fromhex(hexpw)
salt2 = bytes.fromhex(hexsalt)
assert(hashed_pw == pw2)
assert(salt == salt2)
输出:
e6134156ba833d22c30d4e387103505727232f74905b3a3119bd4b6d121cbff4 97181907f5f1a5b61d8c