keamanan pegas menyandikan kata sandi dengan algoritma bcrypt

saya mendapatkan sesuatu yang aneh... di keamanan musim semi untuk menyandikan kata sandi..

saya mencoba mengubah kata sandi saya dan menyimpannya ke database..tetapi saya selalu mendapatkan kesalahan karena string yang berbeda..

seperti ini..

di pengontrol ..

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

dan keluaran ini

masukkan deskripsi gambar di sini

ini aneh...setiap kali saya mengkodekanPassword, saya akan mendapatkan hasil yang berbeda.

saya menggunakan grails 3.0.5 dan menggunakan algoritma bcrypt

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

saya meletakkan baris ini di application.groovy

seperti ini

    // 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'

tetapi ketika saya membuat akun pengguna dengan bootstrap dan menyimpannya ke database.. lalu saya masuk ...itu berjalan dengan benar..

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini


person Community    schedule 23.10.2015    source sumber
comment
btw, akan lebih mudah bagi orang lain jika Anda memasukkan contoh kode, keluaran, dll dalam teks biasa, bukan gambar. sehingga dapat dikutip, atau digunakan untuk percobaan sebelum dijawab   -  person Igor Artamonov    schedule 23.10.2015


Jawaban (1)


Ini adalah fitur. bcrypt menggunakan garam acak, sehingga setiap kali menghasilkan hash yang berbeda bahkan untuk kata sandi yang sama.

Jika Anda ingin memeriksa apakah kata sandi yang dimasukkan valid, Anda perlu menggunakan passwordEncoder.isPasswordvalid untuk Grails, seperti:

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

atau untuk Keamanan Musim Semi biasa passwordEncoder.matches:

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

Untuk melakukan autowire passwordEncoder bean, definisikan saja sebagai properti kelas Anda:

def passwordEncoder
person Igor Artamonov    schedule 23.10.2015
comment
println kata sandi 1 = +passwordEncoder.matches('password','$2a$10$JNUJ3pRiwnOMkVYPRpbdeujyuBLTavozVLinHRnf5MK8VHkif2IGG')... saya tidak dapat menggunakan passwordEncoder - person ; 23.10.2015
comment
apakah Anda mengirimkannya ke layanan/pengontrol/dll? itu adalah kacang yang disediakan pada musim semi - person Igor Artamonov; 23.10.2015
comment
Bagaimana? saya tidak tahu..saya baru saja menambahkan grails.plugin.springsecurity.password.algorithm = 'bcrypt' ini ke application.groovy - person ; 23.10.2015
comment
oh maksudmu panggilan def springSecurityService? saya mengirimkannya...itulah mengapa saya dapat menggunakan springSecurityService.encodePassword - person ; 23.10.2015
comment
tidak, maksudku passwordEncoder, bukan springSecurityService. Selain itu, sebenarnya menurut saya Grails memiliki implementasi yang berbeda, sehingga metodenya bisa disebut .isPasswordValid(hashed, 'password'). Lihat pembaruan jawaban - person Igor Artamonov; 23.10.2015
comment
lihat posting pembaruan saya..saya mendapatkan kesalahan seperti itu... saya sudah menambahkan def passwordEncoder setelah def cityService - person ; 23.10.2015
comment
ketika saya mencoba pernyataan ini passwordEncoder.matches('password','$2a$10$JNUJ3pRiwnOMkVYPRpbdeujyuBLTavozVLinHRnf5MK8VHkif2IGG').. saya mendapatkan kesalahan ini No signature of method: grails.plugin.springsecurity.authentication.encoding.BCryptPasswordEncoder.matches() - person ; 23.10.2015
comment
ya, coba isPasswordValid(hashed, 'password', null) - person Igor Artamonov; 23.10.2015
comment
bolehkah saya tahu isPasswordValid(<this is encrypted string>, <this is real string>,<what is this?>)? - person ; 23.10.2015
comment
isPasswordValid(hashed, plainpassword, salt). Anda tidak bisa menggunakan garam untuk bcrypt, jadi harus null - person Igor Artamonov; 23.10.2015
comment
Jika bcrypt menggunakan garam acak setiap kali, bagaimana cara mengetahui apakah pengguna memasukkan kata sandi yang benar? itu akan melakukan hash pada sesuatu yang berbeda setiap kali...Saya tidak mengerti. - person temporary_user_name; 24.05.2016
comment
@Aerovistae dapatkan garam ini dari hashnya, 128bit/22 karakter pertama dari hash. Atau lebih baik gunakan yang disediakan passwordEncoder.matches - person Igor Artamonov; 25.05.2016