当我在java中使用DigestUtils.md5Hex时,我得到了错误的结果

时间:2017-07-27 07:55:50

标签: java android

我需要一种方法来计算某些文件的md5,以确保Android中的完整性。 所以我使用org.apache.commons.codec.digest.DigestUtils.md5Hex方法来计算文件的md5,但是我得到的结果与我在linux系统中使用@app.route('/somepage') def somepage(): headers={'SomeName':'whatever'} return Response(redirect(url_for('home_page')),status=302, headers=headers) @app.route('/home_page') def home_page(): if request.headers['SomeName'] == 'whatever': return render_template("home_page.html") else: return Response(status=405) 的结果不同。 md5sum的结果不能错,所以我不知道我的代码有什么问题。

代码如下(我使用kotlin,但它与Java相同)):

md5sum

我使用fis和bf作为md5Hex()的参数,它们有不同的结果但不是正确的结果。 但是当我使用像“md5sum”这样的字符串时,我得到的结果与Linux中的其他地方相同。 怎么了?

2 个答案:

答案 0 :(得分:0)

我有一个UtilsEncrypt类来获取带有不同算法的哈希,但是我使用的是java.security而不是commons.codec.digest所以我的导入是:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

这是我的代码

    public class UtilsEncrypt {

        /**
         * @param digest 
                  encrypted message
         * 
         * @return String 
                     result in Hexadecimal format
         */
        private static String toHexadecimal(byte[] digest) {
            String hash = "";
            for (byte aux : digest) {
                int b = aux & 0xff;
                if (Integer.toHexString(b).length() == 1)
                    hash += "0";
                hash += Integer.toHexString(b);
            }
            return hash;

        }

        /***
         * Encrypt a message through an algorithm
         * 
         * @param message
         *            text to encrypt
         * @param algorithm
         *            MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512
         * @return encrypted message
         */
        public static String getStringMessageDigest(String message, String algorithm) {
            byte[] digest = null;
            byte[] buffer = message.getBytes();
            try {
                MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
                messageDigest.reset();
                messageDigest.update(buffer);
                digest = messageDigest.digest();
            } catch (NoSuchAlgorithmException ex) {
                // Do something
            }
            return toHexadecimal(digest);
        }
    }

如你所见,我只使用java.security给我的功能。您可以将许多不同的算法传递给getStringMessageDigest。我有一个与我使用的类型的枚举。也许你可以使用其他算法,但我没有与其他人测试过。 小心重置diggest,以确保你内心没有错误的内容,你将使用一个空的' diggest。

答案 1 :(得分:0)

我遇到了同样的问题,经过一番努力后,我来到这个解决方案,我使用Okio并且代码测试与Php哈希算法兼容。

首先使用md5函数扩展Java File类

import okio.HashingSource
import okio.Okio
import java.io.File

fun File.md5():String?{
    if(!this.exists())
        return null

    val hashingSource = HashingSource.md5(Okio.source(this))
    val bufferedSource = Okio.buffer(hashingSource)

    while(!bufferedSource.exhausted()){
        bufferedSource.readByteArray(1024)
    }

    return hashingSource.hash().hex()
}

然后您只需从文件中生成md5:

val file = File("myfile.ext");
println("File md5: ${file.md5()}")

注意:如果找不到该文件,该函数将返回null