0

Javaクライアントで計算して確認する必要があるUTF-8hash_fileの出力があります。hash_fileのマニュアルに基づいて、ファイルの内容を抽出し、JavaでMD5ハッシュヘックスを作成していますが、それらを一致させることはできません。[この質問]について提案を試みましたが、成功しませんでした2

これが私がJavaでそれを行う方法です:

public static String calculateStringHash(String text, String encoding) 
        throws NoSuchAlgorithmException, UnsupportedEncodingException{
    MessageDigest md = MessageDigest.getInstance("MD5");
    return getHex(md.digest(text.getBytes(encoding)));
}

私の結果はこのページの結果と一致します。

例えば:

ストリングジェイク:1200cf8ad328a60559cf5e7c5f46ee6d

私のJavaコードから:1200CF8AD328A60559CF5E7C5F46EE6D

しかし、ファイルを試してみると、うまくいきません。ファイル関数のコードは次のとおりです。

public static String calculateHash(File file) throws NoSuchAlgorithmException,
            FileNotFoundException, IOException {
        BufferedReader br = null;
        StringBuilder sb = new StringBuilder();
        try {
            String sCurrentLine;
            br = new BufferedReader(new FileReader(file));
            while ((sCurrentLine = br.readLine()) != null) {
                sb.append(sCurrentLine);
            }
        } catch (IOException ex) {
            LOG.log(Level.SEVERE, null, ex);
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException ex) {
                LOG.log(Level.SEVERE, null, ex);
            }
        }
        return calculateStringHash(sb.toString(),"UTF-8");
    }

PHP側でhash_fileが使用され、UTF-8が暗号化されていることを確認しました。何か案は?

4

2 に答える 2

3

読み取りメソッドは、ファイルからすべての行末を削除します。行ターミネータなしreadLine()で行を返します。StringBuilderの内容を印刷すると、問題を理解できます。

さらに、ハッシュアルゴリズムは二項演算です。バイトで動作し、バイトを返します。ファイル内のバイトを文字列に変換し、後で文字列をハッシュするために文字列をバイトの配列に変換し直すのはなぜですか。文字列として読み取るのではなく、InputStreamを使用してファイルをバイト配列として読み取るだけです。次に、このバイト配列をハッシュします。これにより、間違ったファイルエンコーディングを使用することも回避されます(コードはプラットフォームのデフォルトエンコーディングを使用しますが、これはファイルの作成に使用されるエンコーディングではない可能性があります)。

于 2012-12-23T16:41:37.730 に答える
1

を呼び出してから、ファイルの改行文字が欠落していると思いますbr.readLine()

ファイルをバイト配列に読み込み、それをに渡すことをお勧めしmd.digest(...)ます。

于 2012-12-23T16:41:40.450 に答える