3

C#Webサービスと(Java)Androidアプリケーションがあります。これら2つの言語間で同じ結果を生成するSIMPLEハッシュ関数はありますか?最も単純なC#ハッシュはString.GetHashCode()ですが、Javaで複製することはできません。最も単純なJavaハッシュはまったく単純ではありません。そして、C#で正確に複製できるかどうかはわかりません。

関連する場合は、インターネット経由で送信する前にパスワードをハッシュしています。私は現在Encode64を使用していますが、元に戻すことができるため、明らかに安全ではありません。


編集:わかりました、私はSHA256を使用することに決めました。他の誰かが迅速な解決策を必要とする場合に備えて、C#とJavaの両方でまったく同じ文字列を出力する必要があり、可能な限り単純な解決策が必要であることを考慮して、使用したコードを次に示します。

Java

public String Hash(String s)
{
    StringBuffer sb = new StringBuffer();
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(s.getBytes());
        byte byteData[] = md.digest();
        for (int i = 0; i < byteData.length; i++) {
            sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16)
                    .substring(1));
        }
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return sb.toString();
}

C#

public static string Hash(String s)
{
    HashAlgorithm Hasher = new SHA256CryptoServiceProvider();
    byte[] strBytes = Encoding.UTF8.GetBytes(s);
    byte[] strHash = Hasher.ComputeHash(strBytes);
    return BitConverter.ToString(strHash).Replace("-","").ToLowerInvariant().Trim();
}

みんなありがとう!:)

4

4 に答える 4

7

まず、この種のハッシュによって実装され、この種のものに使用するように設計されていないString.GetHashCode()種類のハッシュ。String.hashCode()まず、ハッシュは32になりますが、(少なくともJavaの場合は)数値になるため、衝突の重大なリスクがあります。この場合、2つの異なるパスワードが同じハッシュにマップされると...誰かが2 ^ 32に1の確率で、ランダムに選択されたパスワードが受け入れられます。(逆に、悪意のあるユーザーが有効なパスワードの32ビットハッシュを傍受できる場合、元のパスワードが何であるかを推測するのに大きな「足がかり」があります!)

次に、暗号化ハッシュ(MD5、SHA-256などで生成されたものなど)を送信しても、SSLなどを介してハッシュを送信しない限り、セキュリティの問題はおそらく解決されません。確かに、悪者は元のパスワードを回復することはできませんが、「リプレイ」攻撃でハッシュを傍受して使用することはできます。(これに対抗する方法はいくつかありますが、共有秘密鍵を使用するか、公開/秘密鍵暗号化を使用する必要があります...これを安全にするには、何をしているのかを知る必要があります。)

つまり、問題全体と提案された解決策について、セキュリティに関する確かな専門知識を持っている人と話し合う必要があります。


これがセキュリティの問題ではないと本当に思う場合は、MD5ハッシュで問題ありません。しかし、あなたが警告されなかったと言ってはいけません...

(ただし、base64よりもほとんど安全ではないため、単純な32ビットハッシュコードは使用しないでください。)

于 2012-06-02T04:15:09.747 に答える
3

MD5やSHA256などの標準アルゴリズムを使用します。これは、どのプラットフォームでも同じ結果を生成します(正しく実装されている場合)が、パスワードを送信する前に、これが本当にパスワードを「暗号化」する最良の方法であるかどうかを検討することをお勧めします。ワイヤー。

于 2012-06-02T04:11:26.810 に答える
1

セキュリティを求めている場合は、暗号化を試してください。それ以外の場合は、MD5などの組み込みのハッシュアルゴリズムがあります。これは、2つの間で確実に一貫している必要があります

于 2012-06-02T04:09:54.000 に答える
0

次のコードをJavaで使用でき、C#のコードと一致します。

public static String getEncryptedPassword(String clearTextPassword) throws NoSuchAlgorithmException{

    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(clearTextPassword.getBytes(StandardCharsets.UTF_8));
    byte[] digest = md.digest();
    String hex = String.format("%064x", new BigInteger(1, digest));
    String st = new String(hex.toUpperCase());
    for (int i = 2; i < (hex.length() + hex.length() / 2) - 1 ;) {
        st = new StringBuffer(st).insert(i, "-").toString();
            i = i + 3;        
    }
    return st ; 

}
于 2018-08-03T14:12:33.500 に答える