4

JavaにあるいくつかのコードをC#に変換したいと思います。

Javaコード:

  private static final byte[] SALT = "NJui8*&N823bVvy03^4N".getBytes();

  public static final String getSHA256Hash(String secret)
  {
    try {
      MessageDigest digest = MessageDigest.getInstance("SHA-256");
      digest.update(secret.getBytes());
      byte[] hash = digest.digest(SALT);
      StringBuffer hexString = new StringBuffer();
      for (int i = 0; i < hash.length; i++) {
        hexString.append(Integer.toHexString(0xFF & hash[i]));
      }
      return hexString.toString();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    } 
    throw new RuntimeException("SHA-256 realization algorithm not found in JDK!");
  }

SimpleHashクラスを使おうとすると、さまざまなハッシュが得られました

アップデート:

例えば:

Java:byte [] hash = digest.digest(SALT); 生成(最初の6バイト):

[0] = 9
[1] = -95
[2] = -68
[3] = 64
[4] = -11
[5] = 53
....

C#コード(クラスSimpleHash):string hashValue = Convert.ToBase64String(hashWithSaltBytes); hashWithSaltBytesには(最初の6バイト)があります:

[0] 175 byte
[1] 209 byte
[2] 120 byte
[3] 74  byte
[4] 74  byte
[5] 227 byte
4

5 に答える 5

7

String.getBytesメソッドは、プラットフォームのデフォルトの文字セットを使用して文字列をバイトにエンコードしますが、リンクしたサンプル コードは UTF-8 を使用します。

これを試して:

digest.update(secret.getBytes("UTF-8"));

次に、Integer.toHexString メソッドは、先頭に 0 がない 16 進数の結果を返します。

于 2011-08-17T15:49:18.733 に答える
2

リンク先の C# コードもソルトを使用していますが、Java コードは使用していません。ソルトを 1 回だけ使用し、もう 1 回は使用しない場合、結果は異なります (異なるはずです!)。

于 2011-08-17T15:49:58.030 に答える
2
hexString.append(Integer.toHexString(0xFF & hash[i]));

ハッシュ文字列を正しく構築していません。Integer.toHexStringには先行ゼロが含まれていないため、一方Integer.toHexString(0xFF) == "FF"、問題はInteger.toHexString(0x05) == "5".

推奨される修正:String.format("%02x", hash[i] & 0xFF)

于 2011-08-17T15:55:38.340 に答える
0

SimpleHash クラスをどのように呼び出したか (どのパラメーターを使用するかなど) は実際には記述していません。

ただし、そのComputeHashメソッドにはドキュメントがあることに注意してください。

base64 でエンコードされた文字列としてフォーマットされたハッシュ値。

代わりに、クラスは出力を 16 進数でフォーマットしますが、これは明らかに異なります。

また、ソルトはbase64として解釈されるSimpleHashにありますが、メソッドはそれをASCIIとして解釈します(または、システムエンコーディングが何であれ-おそらくASCII互換のものであり、文字列にはASCII文字のみが含まれます)。

また、SimpleHash の出力にはソルトが含まれています (ランダム ソルトを使用する場合に「検証」部分で再現できるようにするため)、メソッドには含まれていません。

(その他のポイントは、他の回答ですでに言及されています。)

于 2011-08-17T17:33:20.483 に答える