1

C# でハッシュ化されたパスワードを再作成する際に問題があります。オンライン プロジェクトでは、ユーザーが登録プロセスを実行すると、この関数を渡した後にパスワードが保存されます。

private static string ToMD5Hash(string inputString)
{
   using (MD5 md5 = MD5.Create())
   {
      byte[] data = Encoding.Unicode.GetBytes(inputString);
      byte[] hash = md5.ComputeHash(data);

      return Convert.ToBase64String(hash);
   }
}

ある時点でオンライン バージョンと同期するオフライン バージョンに取り組んでいますが、AS3 (Adobe Air) で同じ結果を再現できません。たとえば、C# コードに渡された後のパスワード「1234」は、「DwN1hMmef9T0+MWVUPj1Bw==」になります。

誰かが私を助けることができますか?

私のAS3コードは次のようなものです:

private function encode():void
{
var ba:ByteArray = new ByteArray();
ba.writeMultiByte("1234","unicode");
var str:String = MD5.hash(ba.toString());

var ba2:ByteArray = new ByteArray();
ba2.writeMultiByte(str.toString(),"unicode");

var encoder:Base64Encoder = new Base64Encoder();
encoder.encodeUTFBytes(ba2.toString());
    trace(encoder.toString());
}

私が行うと、C#ba.writeMultiByte("1234","unicode");とまったく同じになりますが、新しいとは異なります。ByteArrayMD5.hash(ba.toString());ByteArray

4

2 に答える 2

1

したがって、ビットをに書き込むas3corelibの実装のバグである可能性がありますdigest ByteArray

リトルエンディアンではなく、ビッグエンディアン形式で記述しているようです。または、より具体的には、ビットをバイトのコレクションではなく4つの整数のコレクションとして書き込み、その過程でビットのバイト順序をマングルします(これが、異なるBase64結果が表示される理由です-バイトは別の順序)。

このバグに対処するには、 MD5.asの184行目をas3corelibに追加し、次の1行のコードを挿入します。

digest.endian = Endian.LITTLE_ENDIAN;

また、のファイルの先頭にインポートを追加してくださいimport flash.utils.Endianここで利用可能な変更の公開要点を作成しました

次に、c#と同じバイト順序を生成し、Base64で同じ方法でエンコードする必要があります。次のas3関数を使用して検証しました。

    private function encode():void 
    { 
        var ba:ByteArray = new ByteArray();
        ba.endian = Endian.BIG_ENDIAN
        ba.writeMultiByte("1234","unicode");
        var str:String = MD5.hashBytes(ba);

        var encoder:Base64Encoder = new Base64Encoder();
        encoder.encodeBytes(MD5.digest);
        trace(encoder.toString()); // DwN1hMmef9T0+MWVUPj1Bw==
    }
于 2012-05-08T17:45:28.923 に答える
0

これを見てください

そのサイトで言及されている元のダウンロードにはいくつかのバグがあることに注意してください。そのため、同じ投稿にある修正されたバージョンを使用する必要があります。

AS3CoreLibを使用している場合は、次のようにします。

as3corelibを使用した別のMD5

于 2012-05-07T09:14:40.590 に答える