2

我用来将文件转换为字符串然后转换为 mdf 的函数如下所示。我正在输出文件路径和文件名以确保一切正常。有什么我没有考虑到的可以改变文件(实际上是视频 mp4)的指纹吗?我正在根据 ubuntu 上的 md5sum 检查它。

private static String readFileToString(String filePath)
        throws java.io.IOException{

            StringBuffer fileData = new StringBuffer(1000);
            BufferedReader reader = new BufferedReader(
                    new FileReader(filePath));
            char[] buf = new char[1024];

            int numRead=0;
            while((numRead=reader.read(buf)) != -1){
                String readData = String.valueOf(buf, 0, numRead);
                fileData.append(readData);
                buf = new char[1024];
            }

            reader.close();
            System.out.println(fileData.toString());
            return fileData.toString();
        }

public static String getMD5EncryptedString(String encTarget){
  MessageDigest mdEnc = null;
  try {
      mdEnc = MessageDigest.getInstance("MD5");
  } catch (NoSuchAlgorithmException e) {
      System.out.println("Exception while encrypting to md5");
      e.printStackTrace();
  } // Encryption algorithm
  mdEnc.update(encTarget.getBytes(), 0, encTarget.length());
  String md5 = new BigInteger(1, mdEnc.digest()).toString(16) ;
  return md5;
}
4

2 回答 2

5

字符串不是二进制数据的容器。丢失字节数组和字符串之间的两次转换。您应该将文件作为字节读取并直接在字节中计算 MD5。您可以在阅读时这样做:您不需要先阅读整个文件。

而且 MD5 不是加密:它是一个安全的散列。

于 2013-07-20T02:02:10.290 回答
3

在这里找到了这个答案:How to generate an MD5 checksum for a file in Android?

public static String fileToMD5(String filePath) {
InputStream inputStream = null;
try {
    inputStream = new FileInputStream(filePath);
    byte[] buffer = new byte[1024];
    MessageDigest digest = MessageDigest.getInstance("MD5");
    int numRead = 0;
    while (numRead != -1) {
        numRead = inputStream.read(buffer);
        if (numRead > 0)
            digest.update(buffer, 0, numRead);
    }
    byte [] md5Bytes = digest.digest();
    return convertHashToString(md5Bytes);
} catch (Exception e) {
    return null;
} finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (Exception e) { }
    }
}
}

private static String convertHashToString(byte[] md5Bytes) {
String returnVal = "";
for (int i = 0; i < md5Bytes.length; i++) {
    returnVal += Integer.toString(( md5Bytes[i] & 0xff ) + 0x100, 16).substring(1);
}
return returnVal;
}
于 2013-07-20T05:36:57.860 回答