jBCrypt checkpw возвращает истину, даже если пароли разные

Я почти уверен, что делаю что-то совершенно не так, но почему этот тест не проходит для последних двух утверждений?

Две относительно похожие, но, тем не менее, разные строки (в основном JWT) проверяют, подходят ли хеши другого?

@Test
public void testMoreHashing() {

    String longToken =  "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJCTFVCQl9BVURJRU5DRSIsInN1YiI6IkNZOXJ6VVloMDNQSzNrNkRKaWUwOWc9PSIsIm5iZiI6MTUxMzI4NzAzNCwiaXNzIjoiSVNTVUVSIiwiZXhwIjoxNTE4NDcxMDM0LCJpYXQiOjE1MTMyODcwMzQsImVtYWlsIjoiYUBiLmNvbSJ9.IYMKztYEIJxzYgHpUDhCHcG22h28OQAsMg7TEMBVYELSczeniwv8IKxgrSBub9Q0X14UT6LnQUu4yeeTofRYH2jRSwW42gfaW5uK8NJQVdluNdZwUsWHVG05gbaSM7ZeS4tH3-SVbUOO3uJ-N2sVcBF5AFLaIAu0GD9CzPU1CjYYc9JiAArztAS5j7pK-xGNTRCKvcoGLa9iG9nhvssTZkPH6kPOJj9RHFo30mgSnPIGSc6040h7n8X7LCUC4qfUe1sOknHomN_RKTQk4Q5FBL1snTyCTxcaErVwvjv__YK9FQ40pDfOboEsSk81CYW6SbqDIdVlyr09VrDzIwJpPA";
    String shortToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJCTFVCQl9BVURJRU5DRSIsInN1YiI6IlU3bFFoV09TUDBmMDdOZ1BWTkd3d0E9PSIsIm5iZiI6MTUxMzI4NzAzNSwiaXNzIjoiSVNTVUVSIiwiZXhwIjoxNTE4NDcxMDM1LCJpYXQiOjE1MTMyODcwMzUsImVtYWlsIjoiYUBiLmNvbSJ9.";

    String longTokenHash = BCrypt.hashpw(longToken, BCrypt.gensalt(13));
    assertTrue(BCrypt.checkpw(longToken, longTokenHash));

    String shortTokenHash = BCrypt.hashpw(shortToken, BCrypt.gensalt(13));
    assertTrue(BCrypt.checkpw(shortToken, shortTokenHash));

    assertFalse(longToken.equalsIgnoreCase(shortToken));
    assertFalse(longTokenHash.equalsIgnoreCase(shortTokenHash));
    assertFalse(longToken.contains(shortToken));

    assertFalse(BCrypt.checkpw(longToken, shortTokenHash));
    assertFalse(BCrypt.checkpw(shortToken, longTokenHash));
}

используемая версия jBCrypt, скопированная из моего pom.xml,

<dependency>
    <groupId>de.svenkubiak</groupId>
    <artifactId>jBCrypt</artifactId>
    <version>0.4</version>
</dependency>

junit - это версия 4.12

Спасибо за помощь :)


person Alex    schedule 14.12.2017    source источник
comment
Обрезает ли эта функция входные данные?   -  person tadman    schedule 15.12.2017
comment
@tadman, возможно, вы правы - только что нашел этот security.stackexchange.com/questions/39849/, где сказано, что blowfish обрезается до 72 символов, и, если я правильно понимаю, первые 79 идентичны ...   -  person Alex    schedule 15.12.2017
comment
Стоит добавить это в качестве ответа, так как я думаю, вы нашли подтверждение.   -  person tadman    schedule 15.12.2017
comment
разве ты не хочешь опубликовать ответ? в основном ты указывал мне в правильном направлении :)   -  person Alex    schedule 15.12.2017
comment
Первые 100 очков всегда самые трудные, так что же не так с небольшой помощью?   -  person tadman    schedule 15.12.2017


Ответы (1)


как указал @tadman, используемый алгоритм blowfish усекает пароли до 72 символов, а различия в используемых паролях начинаются только с 79. см. также https://security.stackexchange.com/questions/39849/does-bcrypt-have-a-maximum-password-length

person Alex    schedule 14.12.2017