3

Spring4D ライブラリには暗号化クラスがありますが、期待どおりに動作させることができません。私はおそらくそれらを間違って使用していますが、例がないため難しくなっています。

たとえば、Web サイトhttps://quickhash.com/hash-sha256-onlineでは、「test」という単語をハッシュして、次のハッシュを生成できます。

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

Spring4D ライブラリを使用して、次のコードは異なるハッシュを生成します。

CreateSHA256.ComputeHash('test').ToString;

結果:

9EFEA1AEAC9EDA04A892885A65FDAE0E6D9BE8C9FC96DA76D31B929262E12B1D

大文字/小文字は別として、まったく異なるハッシュです。何か間違ったことをしているに違いないことはわかっていますが、使用例がないため、これを行う方法にこだわっています。

4

3 に答える 3

9

ハッシュ アルゴリズムは、通常はバイト配列を使用して表されるバイナリ データで動作します。

残念ながら、使用したリソースはどちらもテキストをハッシュする機能を提供しています。テキストをハッシュするには、まずテキストからバイナリに変換する必要があります。そのためには、エンコーディングを選択する必要があります。どちらの方法も、その選択が何であるかを明確にしません。

この Delphi コードを使用すると、次のようになります。

LowerCase(CreateSHA256.ComputeHash(TEncoding.UTF8.GetBytes('test')).ToString)

あなたの質問に表示されているものと同じハッシュを取得します。

テキストを暗号化/ハッシュ化しようとしないでください。代わりに、これらの操作をバイナリでの操作と見なしてください。常に明示的なエンコーディングを使用してから、エンコーディングによって生成されたバイト配列を暗号化/ハッシュします。

ここでは UTF-8 エンコーディングを選択しました。これは完全な Unicode エンコーディングであり、スペースの点で効率的である傾向があるためです。ただし、オンライン エンコーダーは UTF-8 を使用していないと思います。実際、それがどのエンコーディングを使用しているのかわかりません。問題については不明です。もちろん、これはテキストがバイナリと異なるという同じ古い問題です。

私の意見では、エンコーディングを明示的に選択せずにテキストをハッシュできるのは、使用する Delphi ライブラリの設計上の欠陥です。このライブラリがテキストをハッシュする関数を提供する必要がある場合は、呼び出し元が追加のTEncodingパラメーターを提供する必要があります。

于 2014-12-01T08:13:36.730 に答える
4

内部で変換が行われないため、1 文字あたり少なくとも 2 バイトの UnicodeString がハッシュされます。

ページと同じ結果が必要な場合は、UTF8Encode を使用するか、AnsiString として直接渡す必要があります。

ただし、別の Unicode 文字を含む文字列をいくつか試してみたところ、ページは別の結果を返しました。そのため、彼らがそこで文字列をどのように扱っているかはよくわかりません。コードページの問題だと思います。

編集: このページhttp://www.xorbin.com/tools/sha256-hash-calculatorを使用すると、UTF8Encode で TSHA256 と同じハッシュが生成されます。

于 2014-12-01T07:59:17.577 に答える
0

どのタイプの弦を使用していますか? AnsiString または WideString (Unicode 文字列) を使用していますか。Delphi 2009 以降では、デフォルトで WideString を使用しています。

文字列型が重要なのはなぜですか? すべてのハッシュ アルゴリズムは未加工のバイト データで動作するため、文字列の各文字が 1 バイトのメモリ (AnsiString) または複数バイトのメモリ (WideString) に格納されていることが重要です。

于 2014-12-01T06:20:43.770 に答える