首先我读了这个问题并理解不应该使用非随机盐,但对于这种情况,我需要:How can I set salt for bcrypt.hashpw?
我的代码:
import bcrypt
password = "pass"
hashed = bcrypt.hashpw( password, "a0a4310f19")
print hashed
我收到错误:
ValueError: Invalid salt
如何将此字符串转换为可接受的salt类?谢谢!
答案 0 :(得分:3)
我的理解是,salt必须是128位值(16个八位位组),用base-64(24个字符)编码。
如果你想使用固定盐进行(比方说)调试,我会用gensalt()
函数生成一个,然后简单地将其打印出来并永远使用它,而不是尝试一些任意的价值如a0a4310f19
。
如果出于某种原因,你需要在你的问题中使用那个盐,你可能需要将它扩展到128位而不是你现在拥有的40位(假设它们是'实际上是该字符串中的十六进制值,每个字符四位)。
然后base64对它进行编码,将salt标头添加到前面。
因此,将0000000000000000000000a0a4310f19
抽入base64编码器here会为您提供AAAAAAAAAAAAAACgpDEPGQ==
。然后你可以使用salt标头作为前缀:
$2a$12$AAAAAAAAAAAAAACgpDEPGQ==
并且工作正常:
import bcrypt
# Show correct format for verification.
print "Example salt format: %s" % (bcrypt.gensalt())
# Hash with fixed pre-calculated salt.
salt = "$2a$12$AAAAAAAAAAAAAACgpDEPGQ=="
print "Fixed salt hashing: %s" % (bcrypt.hashpw("pass", salt))
您甚至可以使用Python本身将您的10个字符的字符串转换为base64编码的salt,而不是依赖于外部站点:
import bcrypt
import binascii
import base64
# Pre-calculated salt.
fsalt = "$2a$12$AAAAAAAAAAAAAACgpDEPGQ=="
# Your salt value (hex digits).
salt = "a0a4310f19"
# Work out salt based on your value. Could be improved but
# leaving it like this in case you want to check out all
# the intermediate values.
csalt = "0" * 32 + salt # Prefix to >= 32 digits.
csalt = csalt[-32:] # Only use last 32 digits.
csalt = binascii.a2b_hex(csalt) # Convert hex digits to binary.
csalt = base64.b64encode(csalt) # Encode binary with base64.
csalt = "$2a$12$" + csalt # Prefix with salt header.
# Hash with both salts for comparison.
print "Fixed salt hashing: %s" % (bcrypt.hashpw("pass",fsalt))
print "Calcd salt hashing: %s" % (bcrypt.hashpw("pass",csalt))
如果您想要单行设置csalt
,可以使用:
csalt = "$2a$12$" + base64.b64encode(binascii.a2b_hex(("0" * 32 + salt)[-32:]))