Spring Security로 로그인을 구현할 때
기본 password는 BCryptPasswordEncoder 를 사용한다.
mysql의 password() 를 사용하여 password를 저장하는 경우에는 맞지 않기 때문에
MysqlPasswordEncoder를 만들어 적용한다.
--------------------
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import org.springframework.security.crypto.password.PasswordEncoder;
public class MySqlPasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence rawPassword) {
if (rawPassword == null) {
throw new NullPointerException();
}
byte[] bpara = new byte[rawPassword.length()];
byte[] rethash;
int i;
for (i = 0; i < rawPassword.length(); i++)
bpara[i] = (byte) (rawPassword.charAt(i) & 0xff);
try {
MessageDigest sha1er = MessageDigest.getInstance("SHA1");
rethash = sha1er.digest(bpara); // stage1
rethash = sha1er.digest(rethash); // stage2
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
StringBuffer r = new StringBuffer(41);
r.append("*");
for (i = 0; i < rethash.length; i++) {
String x = Integer.toHexString(rethash[i] & 0xff).toUpperCase();
if (x.length() < 2) r.append("0"); r.append(x);
}
return r.toString();
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
if (encodedPassword == null || rawPassword == null) { return false; }
if (!encodedPassword.equals(encode(rawPassword))) { return false; }
return true;
}
}
-------------------
사용방법 : UserServiceImpl 등 login 처리를 하는 class에서
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@Autowired
private MySqlPasswordEncoder mysqlPasswordEncoder;
...
//user.setPassword(passwordEncoder.encode(registration.getPassword())); user.setPassword(mysqlPasswordEncoder.encode(registration.getPassword()));
기존에 사용하던 BCryptPasswordEncoder 대신 MysqlPasswordEncoder 를 사용하면 됨.