Я нашел причину, посмотрев ее реализацию на странице 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 из этого массива, а функция, которая извлекает солевые байты из солевых разрывов ранее, оставляет меня с 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, потому что сгенерированная солт-часть hashtedText отличается от сгенерированной пользователем соли.