Spring безопасность закодирует пароль с алгоритмом bcrypt

у меня что-то странное ... весной безопасность для кодирования пароля ..

я пытаюсь изменить свой пароль и сохранить его в базе данных .. но я всегда получаю сообщение об ошибке, потому что другая строка ..

нравится..

в контроллере ..

println "password  = "+oldPass
println "password 1 = "+springSecurityService.encodePassword('password')
println "password 2 = "+springSecurityService.encodePassword('password')
println "password  = "+springSecurityService.encodePassword(oldPass)

и этот выход

введите описание изображения здесь

это странно ... каждый раз, когда я кодирую пароль, я получаю разные результаты.

Я использую grails 3.0.5 и использую алгоритм bcrypt

grails.plugin.springsecurity.password.algorithm = 'bcrypt'

я помещаю эту строку в application.groovy

нравится

    // Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'com.akiong.security.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'com.akiong.security.UserRole'
grails.plugin.springsecurity.authority.className = 'com.akiong.security.Role'
grails.plugin.springsecurity.requestMap.className = 'com.akiong.security.RequestMap'
grails.plugin.springsecurity.securityConfigType = 'Requestmap'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    '/':                ['permitAll'],
    '/error':           ['permitAll'],
    '/index':           ['permitAll'],
    '/index.gsp':       ['permitAll'],
    '/shutdown':        ['permitAll'],
    '/assets/**':       ['permitAll'],
    '/**/js/**':        ['permitAll'],
    '/**/css/**':       ['permitAll'],
    '/**/images/**':    ['permitAll'],
    '/**/favicon.ico':  ['permitAll']
]
grails.plugin.springsecurity.password.algorithm = 'bcrypt'

но когда я создаю учетную запись пользователя с помощью начальной загрузки и сохраняю ее в базе данных ... затем я вхожу в систему ... она работает правильно ..

введите описание изображения здесь

введите описание изображения здесь


person Community    schedule 23.10.2015    source источник
comment
Кстати, другим людям будет намного проще, если вы поместите образцы кода, вывод и т. д. в виде обычного текста вместо изображений. чтобы его можно было процитировать или использовать для эксперимента перед ответом   -  person Igor Artamonov    schedule 23.10.2015


Ответы (1)


Это особенность. bcrypt использует случайную соль, поэтому каждый раз генерирует другой хеш даже для одного и того же пароля.

Если вы хотите проверить, действителен ли введенный пароль, вам нужно использовать passwordEncoder.isPasswordvalid для Grails, например:

assert passwordEncoder.isPasswordValid( 
       '$2a$10$Qb7ENpWOSsFUS2UvwT1BRefZhn55roXPgUI8fjJRm6c/nR3JIQP8a',
       'password', null)
assert passwordEncoder.isPasswordValid(
       '$2a$10$sC3.yrmNn2VLS2Aer359rei/DxoLlwFq7s6ndAHm10ncyQpIr3MfO',
       'password', null)

или для простой Spring Security passwordEncoder.matches:

assert passwordEncoder.matches('password', 
       '$2a$10$Qb7ENpWOSsFUS2UvwT1BRefZhn55roXPgUI8fjJRm6c/nR3JIQP8a')
assert passwordEncoder.matches('password', 
       '$2a$10$sC3.yrmNn2VLS2Aer359rei/DxoLlwFq7s6ndAHm10ncyQpIr3MfO')

Чтобы автоматически подключить bean-компонент passwordEncoder, просто определите его как свойство вашего класса:

def passwordEncoder
person Igor Artamonov    schedule 23.10.2015
comment
println password 1 = + passwordEncoder.matches ('пароль', '$ 2a $ 10 $ JNUJ3pRiwnOMkVYPRpbdeujyuBLTavozVLinHRnf5MK8VHkif2IGG') ... я не могу использовать passwordEncoder - person ; 23.10.2015
comment
вы подключили его к своему сервису / контроллеру / и т. д.? это фасоль, предоставленная весной - person Igor Artamonov; 23.10.2015
comment
как? я не знаю .. я просто добавляю этот grails.plugin.springsecurity.password.algorithm = 'bcrypt' в application.groovy - person ; 23.10.2015
comment
о, вы имели в виду вызов def springSecurityService? Я подключаю его ... вот почему я могу использовать springSecurityService.encodePassword - person ; 23.10.2015
comment
нет, я имею в виду passwordEncoder, а не springSecurityService. Кроме того, на самом деле я думаю, что у Grails другая реализация, поэтому метод можно было бы назвать .isPasswordValid(hashed, 'password'). См. Обновление ответа - person Igor Artamonov; 23.10.2015
comment
см. мое сообщение об обновлении ... я получаю такую ​​ошибку ... я уже добавляю def passwordEncoder после def cityService - person ; 23.10.2015
comment
когда я пробую это assert passwordEncoder.matches('password','$2a$10$JNUJ3pRiwnOMkVYPRpbdeujyuBLTavozVLinHRnf5MK8VHkif2IGG') .. я получаю эту ошибку No signature of method: grails.plugin.springsecurity.authentication.encoding.BCryptPasswordEncoder.matches() - person ; 23.10.2015
comment
да, попробуйте isPasswordValid(hashed, 'password', null) - person Igor Artamonov; 23.10.2015
comment
могу я знать isPasswordValid(<this is encrypted string>, <this is real string>,<what is this?>)? - person ; 23.10.2015
comment
isPasswordValid(hashed, plainpassword, salt). вы не можете использовать соль для bcrypt, поэтому она должна быть null - person Igor Artamonov; 23.10.2015
comment
Если bcrypt каждый раз использует случайную соль, как он сможет узнать, ввел ли пользователь правильный пароль? он каждый раз перебирал что-то новое ... Я не понимаю. - person temporary_user_name; 24.05.2016
comment
@Aerovistae просто возьми эту соль из хеша, это первые 128 бит / 22 символа из хеша. Или лучше использовать при условии passwordEncoder.matches - person Igor Artamonov; 25.05.2016