1

残念ながら、これを行うコードがいくつかあります。

            byte[] plainText = System.Text.Encoding.ASCII.GetBytes(ClearText);
            var btcipherText = enc.Encrypt(plainText, btkey);
            System.Text.Encoding en = System.Text.Encoding.Default;
            return en.GetString(btcipherText);

その後、ユーザーのパスワードとしてデータベースに保存されます。

モノラルでは、Ubuntu 12.04ではSystem.Text.Encoding.DefaultSystem.Text.Encoding.UTF8ですが、Windows7ではのようSystem.Text.SBCSCodePageEncodingです。

パスワードの暗号化/復号化コードは使用されるべきではありませんでしSystem.Text.Encoding.Defaultたが、これは継承されたコードです。を調べSystem.Text.Encodingて、問題を広範囲に調べたところ、この文字列を標準のエンコーディングで、この場合は元のエンコーディングがないMono/Linuxスタックでどのようにデコードできるかを判断できません。

私も不思議なことに多くの情報を見つけることができませんでしたSystem.Text.SBCSCodePageEncoding

このエンコーディングで保存された文字列を復号化しようとすると、通常の「不正なデータ」と「無効なブロックサイズ」の暗号化例外が発生します。

任意の情報や提案をいただければ幸いです。

4

2 に答える 2

1

バイト[]を文字列に変換するために使用されるエンコーディングの制限されたセットがわかっている場合は、他の答えに基づいて、読み取りとパスワードをデコードして有効なbyte[]に戻し、byte[]をBase64としてデータベースに保存します。

パスワードのハッシュも検討していると思います。この場合、および実際にはテキストを表さないbyte []を処理する場合は、文字として保存/表示する必要があるため、base64が常に適切なオプションです。

パスワードをハッシュする場合は、単なるパスワードとソルトではなく、HMACスタイルのハッシュシステムを使用するようにしてください。または、.netのbcrypt実装を入手することをお勧めします。

http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

于 2012-10-03T11:50:36.433 に答える
0

この場合、データベースからすべてのパスワードを復号化し、UTF8エンコーディングで暗号化して、データベースを更新するアプリを作成します。次に、元のコードをUTF8に変更します。

于 2012-09-30T10:26:51.033 に答える