只介绍mysql_native_password认证方法
1 安全密码验证(mysql_native_password)
客户端期望一个20字节的随机加密字符,参考HandshakeV10握手报文的auth-plugin-data-part-1和auth-plugin-data-part-2,这个两个字段组合在一起是20个字节的加密字符
客户端根据下面描述的算法返回一个20字节的响应
1.1 加密方法
SHA1( password ) XOR SHA1( "20-bytes random data from server" <concat> SHA1( SHA1( password ) ) )
1.2 加密算法java实现
public static final byte[] scramble411(byte[] pass, byte[] seed)
throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] pass1 = md.digest(pass);
md.reset();
byte[] pass2 = md.digest(pass1);
md.reset();
md.update(seed);
byte[] pass3 = md.digest(pass2);
for (int i = 0; i < pass3.length; i++) {
pass3[i] = (byte) (pass3[i] ^ pass1[i]);
}
return pass3;
}