为什么org.mindrot.JBCrypt在这里说盐长度不好?

时间:2018-12-14 00:02:35

标签: java spring bcrypt jbcrypt

希望例子值得一千个单词。如果没有,这里有几个测试,在第一个测试中使用盐种子hello world,在第二个测试中使用static seed to be used,对PlainText static seed to be usedd进行哈希处理。 盐种子用于生成可以传递给BCrypt.hashpw(plainText, staticSalt)函数的静态盐。如您所见,盐字节和盐字节字符串的长度相似,但是会引发错误。我知道这很糟糕,但是我有服用静盐的原因,所以请您集中精力解决这个问题。

org.mindrot.jbcrypt.BCrypt与JDK1.7测试1-PlainText:“ hello world”,salteseed:“要使用的静态种子”

Salt bytes for "static seed to be used": [-30, -8, 86, -8, 6, -126, -64, -30, -82, -82, -104, -64, -8, -118, -64, 108, -82, -64, 14, -30, -82, -104]
Salt bytes string: 4vhW+AaCwOKurpjA+IrAbK7ADuKumA==, length: 32
complete salt: $2a$12$4vhW+AaCwOKurpjA+IrAbK7ADuKumA==
Exception in thread "main" java.lang.IllegalArgumentException: Bad salt length
at org.mindrot.jbcrypt.BCrypt.crypt_raw(BCrypt.java:619)
at org.mindrot.jbcrypt.BCrypt.hashpw(BCrypt.java:684)

带有JDK1.8测试1的org.springframework.security.crypto.bcrypt.BCrypt-PlainText:“ hello world”,saltese:“要使用的静态种子”

Salt bytes for "static seed to be used": [-30, -8, 86, -8, 6, -126, -64, -30, -82, -82, -104, -64, -8, -118, -64, 108, -82, -64, 14, -30, -82, -104]
Salt bytes string: 4vhW+AaCwOKurpjA+IrAbK7ADuKumA==, length: 32
complete salt: $2a$12$4vhW+AaCwOKurpjA+IrAbK7ADuKumA==
Plain text: hello world, Hash text: $2a$12$4vhWHrTxEMtyyv6wmpOtX.YYbTqHwHv/dxe

org.mindrot.jbcrypt.BCrypt与JDK1.7测试2-PlainText:“ hello world”,salteseed:“要使用的静态种子”

Salt bytes for "static seed to be usedd": [85, 108, -73, 108, 111, -27, -32, 85, 19, 19, -4, -32, 108, -7, -32, -50, 19, -32, -125, 85, 19, -4]
Salt bytes string: VWy3bG/l4FUTE/zgbPngzhPgg1UT/A==, length: 32
complete salt: $2a$12$VWy3bG/l4FUTE/zgbPngzhPgg1UT/A==
Plain text: hello world, Hash text: $2a$12$VWy3bG/l4FUTE/zgbPngze9KDSXjF72NBMBNE6ZJk4StahyAhykgO

带有JDK1.8测试2的org.springframework.security.crypto.bcrypt.BCrypt-PlainText:“ hello world”,saltese:“要使用的静态种子”

Salt bytes for "static seed to be usedd": [85, 108, -73, 108, 111, -27, -32, 85, 19, 19, -4, -32, 108, -7, -32, -50, 19, -32, -125, 85, 19, -4]
Salt bytes string: VWy3bG/l4FUTE/zgbPngzhPgg1UT/A==, length: 32
complete salt: $2a$12$VWy3bG/l4FUTE/zgbPngzhPgg1UT/A==
Plain text: hello world, Hash text: $2a$12$VWy3bG/l4FUTE/zgbPngze9KDSXjF72NBMBNE6ZJk4StahyAhykgO

我尝试添加和删除更多字母并成功获得哈希。我很高兴JUnit测试中使用的第一个String引发了错误。

谢谢。

1 个答案:

答案 0 :(得分:0)

我通过在GitHub页面上查看其实现找到了原因... BCrypt的此实现支持base64点(。)字符,而不是标准的plus(+)字符。

static private final byte index_64[] = {
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, 0, 1, 54, 55,
        56, 57, 58, 59, 60, 61, 62, 63, -1, -1,
        -1, -1, -1, -1, -1, 2, 3, 4, 5, 6,
        7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
        17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
        -1, -1, -1, -1, -1, -1, 28, 29, 30,
        31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
        41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
        51, 52, 53, -1, -1, -1, -1, -1
};

“ +”字符的整数值为43,因此从该数组返回-1,并且从salt检索盐字节的函数更早中断,使我剩下4字节盐。甚至其实现都说它不支持标准的base64编码字符串:

/**
 * Decode a string encoded using bcrypt's base64 scheme to a
 * byte array. Note that this is *not* compatible with
 * the standard MIME-base64 encoding.
 */
static byte[] decode_base64(String s, int maxolen)
        throws IllegalArgumentException {

从切换。 +给我一个不同于Spring的包含+盐的哈希值。不太熟悉shift和&进行更改,因此将寻找Spring-Security的实现。

编辑:刚刚看了一下Spring的实现。难怪它没有用...完全一样,只是Spring继续使用4字节的盐进行哈希处理,而jbcrypt抛出错误,因此Spring中存在一个错误,而如果您生成自己的哈希并且包含+,则checkpw(plainText,hashedText)将返回false,因为hashedText的盐生成部分与用户生成的盐不同。