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



希望这个例子胜过千言万语。如果没有,这里有两个测试,在第一个测试中使用盐种子static seed to be used,在第二个测试中用static seed to be usedd对普通文本hello world进行散列。盐种子用于生成可传递到BCrypt.hashpw(plainText, staticSalt)函数中的静态盐。正如您所看到的,salt字节和salt字节字符串的长度相似,但它抛出了一个错误。我知道这很糟糕,但我有我的理由静态盐,所以请把你的注意力放在这个问题上。

org.mindrot.jbrypt.Brypt with JDK1.7 Test 1-PlainText:"你好世界",saltseed:"要使用的静态种子">

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)

org.springframework.security.crypto.brypto.bcrypt with JDK1.8 Test 1-PlainText:"hello world",saltseed:"要使用的静态种子">

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.jbrypt.BCrypt with JDK1.7 Test 2-PlainText:"你好,世界",saltseed:"要使用的静态种子">

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

org.springframework.security.crypto.brypto.bcrypt with JDK1.8 Test 2-PlainText:"你好,世界",saltseed:"要使用的静态种子">

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抛出了一个错误。

提前谢谢。

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

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中检索salt字节的函数早些时候中断,给我留下了4个字节的salt。甚至它的实现也表示不支持标准的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 {

从切换。to+给了我一个与Spring不同的关于含+盐的散列。对shift和&要进行更改,请转而查找Spring Security的实现。

编辑:刚刚看了一下Spring的实现。难怪它不起作用。。。这完全相同,除了Spring继续使用4字节的salt进行哈希,而jbcrypt抛出错误,因此Spring中存在错误,而如果您生成自己的哈希,并且它包含+,那么checkpw(plainText,hashedText(将返回false,因为hashtedText的生成salt部分与用户生成的salt不同

相关内容

  • 没有找到相关文章

最新更新