web-dev-qa-db-ja.com

ASP.NET2.0メンバーシップからの「暗号化された」パスワードの復号化

Aspnet_Membershipテーブルにある暗号化された(ハッシュされていない)パスワードを復号化する必要があります。そのデータベースには、Password(Encrypted)フィールドとPasswordSaltフィールドがあり、web.configを調べて、machinekey> decodeionKey(validation = "SHA1" decodeion = "AES")を見つけることができます。

注:ハッシュ化されたパスワードを使用したいのですが、ビジネス上の理由から、他のリモートシステムとの間のSSOのために、メンバーのパスワードを使用できる必要があります。したがって、暗号化を使用します(間違いなくClearを使用しない-yukky!)

それをすべて考えると、パスワードを明確でわかりやすく読みやすいテキスト、つまり復号化して取得する方法は確かにありますが、ウェブサイトを見つけたり、stackoverflowで答えたりするのに本当に苦労しています(そして私はすべての「類似したこれを行う方法を説明する「質問」および「同様のタイトルの質問」はこちら)。

MembershipProvider.DecryptPassword Method ページを見つけましたが、コードでこれを実際に使用する方法をまだ理解できません。 Google経由で他のページも見つけましたが、パスワードの復号化のほとんどの例では、saltとdecrytionKeyが考慮されていないようです。

誰かがそれぞれの場所からパスワード、passwordsalt、decryptykeyを選択し、それらを使用してASP.NET 2.0メンバーシップ暗号化パスワードを暗号化する簡単な例を持っていますか?

16
QMKevin

SqlMembershipProviderから継承するクラスを作成し、その中で復号化を呼び出すことができます。

これに必要なすべてのコードは Naveen Kohliによるこの記事 にあります:

リフレクターのコードを調べたところ、Microsoftプロバイダーが2つのステップで復号化することがわかりました。暗号化されたパスワードは、実際には暗号化されたデータのBase64変換です。そのため、最初にBase64から変換し直してから、DecryptPasswordメソッドを呼び出します。私はただ最も簡単なことをしました。 Microsoft実装からコードをコピーし、実行していたすべてのチェックを削除してから使用しました。次のクラスは、指定された暗号化されたパスワードのパスワードをクリアテキストで返すだけのメソッドを持つSqlMembershipProviderから派生したクラスの例です。

namespace MembershipPasswordRecover
{
    public class NetFourMembershipProvider : SqlMembershipProvider
    {
        public string GetClearTextPassword(string encryptedPwd)
        {
            byte[] encodedPassword = Convert.FromBase64String(encryptedPwd);
            byte[] bytes = this.DecryptPassword(encodedPassword);
            if (bytes == null)
            {
                return null;
            }
            return Encoding.Unicode.GetString(bytes, 0x10, bytes.Length - 0x10);

        }
    }
}

static void Main(string[] args)
{
    var passwordManager = new NetFourMembershipProvider();
    var clearPWd = passwordManager.GetClearTextPassword("encryptedpasswordhere");
    Console.WriteLine(clearPWd);
}
13