【发布时间】:2011-08-19 03:33:12
【问题描述】:
你好 我正在寻找一种方法来产生与 Java 中 MySQL 的 PASSWORD 函数相同的结果。 Java代码中有MySQL的PASSWORD()函数的实现吗?
例如:
密码:123 在 MySQL PASSWORD ('123') -> *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
希望你能帮到我
【问题讨论】:
你好 我正在寻找一种方法来产生与 Java 中 MySQL 的 PASSWORD 函数相同的结果。 Java代码中有MySQL的PASSWORD()函数的实现吗?
例如:
密码:123 在 MySQL PASSWORD ('123') -> *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
希望你能帮到我
【问题讨论】:
根据@ypercube 指出的答案,MySQL PASSWORD() 只是sha1,应用了两次。
public static String MySQLPassword(String plainText) throws UnsupportedEncodingException {
byte[] utf8 = plainText.getBytes("UTF-8");
return "*" + DigestUtils.shaHex(DigestUtils.sha(utf8)).toUpperCase();
}
编辑:经过测试,添加了 throws 子句,大写和前缀“*”。
工作代码(替换不工作的 shaHex()):
public static String MySQLPassword(String plainText)
throws UnsupportedEncodingException
{
byte[] utf8 = plainText.getBytes("UTF-8");
byte[] test = DigestUtils.sha(DigestUtils.sha(utf8));
return "*" + convertToHex(test).toUpperCase();
}
【讨论】:
*。
sha 而不是shaHex,并用您自己的函数将其包装起来,将byte[] 转换为十六进制字符串。
sha()两次了吗?
这是一个使用MessageDigest 的示例,并转换为十六进制字符串。所以,就用它吧。
http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml
【讨论】:
这个问题几乎是一样的——把“Java”换成“.NET or MS-SQL-Server”:
simulating-mysqls-password-encryption-using-net-or-ms-sql
它将让您了解如何将 MySQL PASSWORD() 函数转换为 Java。
请注意,PASSWORD() 的目的是供 MySQL 内部使用,应使用其他更安全的方法在应用程序代码中进行散列和身份验证。除非你以某种方式被限制使用这个。
【讨论】:
稍微更新了itsadok's answer。
public static String MySQLPassword(String plainText) throws UnsupportedEncodingException {
byte[] utf8 = plainText.getBytes("UTF-8");
return "*" + DigestUtils.sha1Hex(DigestUtils.sha1(utf8)).toUpperCase();
}
【讨论】: