如何从bcrypt.hashpw的字符串创建非随机盐

时间:2014-07-14 04:39:25

标签: python bcrypt

首先我读了这个问题并理解不应该使用非随机盐,但对于这种情况,我需要:How can I set salt for bcrypt.hashpw?

我的代码:

import bcrypt

password = "pass"

hashed = bcrypt.hashpw( password, "a0a4310f19")

print hashed

我收到错误:

ValueError: Invalid salt

如何将此字符串转换为可接受的salt类?谢谢!

1 个答案:

答案 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:]))