【问题标题】:Implementation of MySQL’s PASSWORD() Function in JavaMySQL的PASSWORD()函数在Java中的实现
【发布时间】:2011-08-19 03:33:12
【问题描述】:

你好 我正在寻找一种方法来产生与 Java 中 MySQL 的 PASSWORD 函数相同的结果。 Java代码中有MySQL的PASSWORD()函数的实现吗?

例如:

密码:123 在 MySQL PASSWORD ('123') -> *23AE809DDACAF96AF0FD78ED04B6A265E05AA257

希望你能帮到我

【问题讨论】:

    标签: java php mysql


    【解决方案1】:

    根据@ypercube 指出的答案,MySQL PASSWORD() 只是sha1,应用了两次。

    使用Apache Commons Codec:

    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();
    }
    

    【讨论】:

    • 您缺少领先的*
    • 对不起它不起作用我得到以下异常:05-05 10:43:25.392: ERROR/AndroidRuntime(29427): java.lang.NoSuchMethodError: org.apache.commons.codec。 binary.Hex.encodeHexString
    • @user 我对 Android 了解不多,但似乎您可能必须自己转换为十六进制。只需使用sha 而不是shaHex,并用您自己的函数将其包装起来,将byte[] 转换为十六进制字符串。
    • 如果我只使用“sha”我得到:[B@4637d2e0 然后我使用我自己的转换我得到:PWHash:40bd001563085fc35165329ea1ff5c5ecbdbbeef 但应该是这样的:23AE809DDACAF96AF0FD78ED04B6A265E05AA257 it' >
    • @user:你申请sha()两次了吗?
    【解决方案2】:

    这是一个使用MessageDigest 的示例,并转换为十六进制字符串。所以,就用它吧。

    http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml

    【讨论】:

    • 当 shaHex() 不起作用时,方法 private static String convertToHex(byte[] data) { ... } 非常完美,谢谢
    【解决方案3】:

    这个问题几乎是一样的——把“Java”换成“.NET or MS-SQL-Server”:

    simulating-mysqls-password-encryption-using-net-or-ms-sql

    它将让您了解如何将 MySQL PASSWORD() 函数转换为 Java。


    请注意,PASSWORD() 的目的是供 MySQL 内部使用,应使用其他更安全的方法在应用程序代码中进行散列和身份验证。除非你以某种方式被限制使用这个。

    【讨论】:

      【解决方案4】:

      稍微更新了itsadok's answer

      public static String MySQLPassword(String plainText) throws UnsupportedEncodingException {
              byte[] utf8 = plainText.getBytes("UTF-8");
              return "*" + DigestUtils.sha1Hex(DigestUtils.sha1(utf8)).toUpperCase();
          }
      

      【讨论】:

      • 这个既有效又不使用贬低的 sha 和/或 shaHex 函数
      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2015-01-29
      • 2013-10-13
      • 2014-10-26
      • 2013-05-13
      • 2023-03-09
      相关资源
      最近更新 更多