希望这个例子胜过千言万语。如果没有,这里有两个测试,在第一个测试中使用盐种子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不同