2015-07-08 3 views
2

Пока мое приложение представляет собой хэширование пользовательских паролей с использованием простого алгоритма MD5, теперь мы внедрили Spring Security в приложение и предпочли бы вместо этого использовать BCrypt. Моя проблема: как перенести старые пароли в новый алгоритм.Переключение с MD5 на BCrypt с Spring Security

  1. Могу ли я предоставить несколько кодеров с паролем для обеспечения безопасности Spring, чтобы их можно было использовать по очереди?
  2. После успешного входа в систему, как изменить пароль, поскольку пароль передается с использованием алгоритма SHA1?

Для проблемы 1, я считаю, что использование CustomAuthenticationProvider может работать, но я полностью смущен тем, как использовать это в нашей системе. Ниже моя configureGlobal функция из класса SecurityConfig

@Autowired 
     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
      auth.jdbcAuthentication() 
        .dataSource(dataSource) 
        .passwordEncoder(passwordEncoder) 
        .usersByUsernameQuery("SELECT uname AS username, upwd AS password, true AS enabled FROM user_table WHERE uname!='' AND uname IS NOT NULL AND uname=?") 
        .authoritiesByUsernameQuery("SELECT uname AS username, 'Default' AS role FROM user_table WHERE uname!='' AND uname IS NOT NULL AND uname=?"); 
     } 

я не использовал UserDetailsService в моем приложении, и только выше запросы поступают. Я использовал CustomUsernamePasswordAuthetationFilter и CustomPasswordEncoder, если это может быть полезно в этой проблеме.

Спасибо,

+0

MD5 - это алгоритм Хеширования в одностороннем порядке, который нельзя дешифровать (хотя большинство возможных открытых паролей MD5-хэшей найдены в онлайн-режиме, теоретически он не может быть расшифрован). Одним из возможных решений является изменение пароля, хранящегося в БД от MD5 до Bcrypt, с использованием пароля открытого текста, предоставленного пользователем во время входа в систему (Ofcourse только после успешного входа в систему). –

+0

Вы должны иметь подкласс 'BCryptPasswordEncoder', переопределить метод' matches', чтобы сначала разрешить 'BCryptPasswordEncoder', и если совпадение не увенчалось успехом, попробуйте сопоставить MD5 с существующим кодом. Вместо того, чтобы пытаться переименовать существующие пароли, может быть лучше посоветовать пользователям менять свои пароли, как только вы полностью переместитесь в BCrypt. Если у вас есть надежная функция «Забыли пароль», возможно, даже не удастся сопоставить ее с MD5 и позволить пользователям выбирать новые пароли (которые в любом случае будут зашифрованы с помощью BCrypt). – manish

+0

@ user1354678 Простые текстовые пароли не путешествуют по сети, поэтому на стороне сервера я понятия не имею, какой был пароль :(даже после успешного входа в систему. – aProgrammer

ответ

3

Вы должны быть в состоянии подкласса BCryptPasswordEncoder, переопределить метод matches сначала давайте BCryptPasswordEncoder попробовать и найти матч, если матч не удается, попробуйте MD5 матч с существующим кодом. Таким образом, каждый, у кого есть BCrypt хэшированный пароль и обеспечивает правильное значение, будет быстро зарегистрирован (из-за встроенной логики BCryptPasswordEncoder). Каждый, у кого есть старый пароль MD5 и содержит правильное значение, также войдет в систему (из-за вашего пользовательского кода), но повлечет за собой дополнительное наказание за то, что он прошел через матч BCrypt. Все остальные не войдут в систему, но путь к неудаче входа в систему повлечет за собой штраф в размере MD5.

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

Если у вас есть надежная функция «Забыл пароль», возможно, даже не будет соответствовать MD5. Вы просто разрешите пользователям входить в систему со старым хешированным паролем MD5 и попросить их использовать функциональность Forgot Password для создания новой (которая будет зашифрована с BCrypt в любом случае).

+0

'сначала пусть BCryptPasswordEncoder попытается найти совпадение, и если совпадение не увенчалось успехом, попробуйте соответствие MD5 с вашим существующим кодом' - плохое решение IMO –

+0

@ TheCoder заботится о разработке? – zero01alpha

Смежные вопросы