将 MD5 消息摘要从 Java 转换为 Digest::MD5 Ruby



我想像java代码一样在Ruby上使用Digest::MD5。这是 java 代码:

public static String MD5Encode(String input, String salt) {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            byte[] hash = null;
            try {
                messageDigest.update(salt.getBytes("UTF-8"));
                messageDigest.update(input.getBytes("UTF-8"));
                hash = messageDigest.digest();
            } catch (UnsupportedEncodingException exception) {
                logger.error("MD5Encoder:Encode:" + exception.toString());
            }
            if (hash != null) {
                StringBuilder output = new StringBuilder(2 * hash.length);
                for (byte b : hash) {
                    output.append(String.format("%02x", b & 0xff));
                }
                return output.toString();
            }
        } catch (NoSuchAlgorithmException exception) {
            logger.error("MD5Encoder:Encode:" + exception.toString());
        }
        return null;
    }

这是 Ruby 代码,但结果不对:(Java 中的输入变量是 Ruby 上的密码变量,两者上的 salt 变量相同)

 salt = SecureRandom.hex
  if (params[:gamestate_password] != "")
    password = Digest::MD5.hexdigest(params[:gamestate_password] + salt)
    user_query = "UPDATE user_v54 SET password= '#{password}', passwordSalt= '#{salt}' WHERE userId='#{params[:userId]}'"
  end

你应该按照与java相同的顺序将盐放在ruby中(在密码前面):

password = Digest::MD5.hexdigest(salt + params[:gamestate_password])

最新更新