2

ユーザーのログオンプロファイルを保持するクラスがあります。これは、ディスクにシリアル化するだけの単純なクラスです。確かに暗号化や圧縮などのシリアル化プロセスは可能ですが、他の理由でシンプルにしたいと思います。

シリアル化される項目の1つは、Password(文字列)プロパティです。シリアル化されていてもかまいませんが、シリアル化された値を3DES暗号化して、誰かがリーダーでファイルを開いた場合でもパスワードが危険にさらされないようにしたいのです。パスワード値を暗号化された値として設定し、暗号化された値をGETするだけでよいことはわかっていますが、少し自動化して、GET'erが呼び出されたときに復号化を処理し、SET'erが暗号化を処理するようにします。シームレス。

これを実現するための最良の方法は何だと思いますか?私が考えているのは、シリアライザーによって無視されるように「パスワード」プロパティをマークする必要があるということです。これは、暗号化された値を保持し、したがって復号化された値を返す別のプロパティへのパスにすぎません。これはこれを処理するための最良の/唯一の方法ですか?シリアル化されたクラスロジック内で暗号化/復号化を維持するためにこれを行うことができる唯一の方法でこれをコーディングする前に、もっと簡単な方法があるかどうかを確認したいだけです。

ありがとう。

4

3 に答える 3

11

シリアル化によってパスワード プロパティを無視するようにマークし、一種のラッパー プロパティを使用してシリアル化することができます。

public class LogonInfo
{
    [XmlIgnore]
    public string Password { get; set; }

    public string EncPassword {
    {
        get
        {
            return Encrypt(Password);
        }
        set
        {
            Password = Decrypt(value);
        }
    }

    // TODO: add Encrypt and Decrypt methods
}
于 2012-04-17T21:02:21.630 に答える
2

ExtendedXmlSerializerを使用できます。暗号化が必要なプロパティを持つクラスがある場合:

public class Person
{
    public string Name { get; set; }
    public string Password { get; set; }
}

インターフェイス IPropertyEncryption を実装する必要があります。たとえば、Base64 エンコーディングが表示されますが、実際にはより安全なものを使用する方が適切です。RSA.:

public class Base64PropertyEncryption : IPropertyEncryption
{
    public string Encrypt(string value)
    {
        return Convert.ToBase64String(Encoding.UTF8.GetBytes(value));
    }

    public string Decrypt(string value)
    {
        return Encoding.UTF8.GetString(Convert.FromBase64String(value));
    }
}

Person クラスの構成では、暗号化するプロパティを指定する必要があります。

public class PersonConfig : ExtendedXmlSerializerConfig<Person>
{
    public PersonConfig()
    {
        Encrypt(p => p.Password);
    }
}

次に、PersonConfig クラスと IPropertyEncryption の実装を登録する必要があります。ドキュメントでは、Autofac を使用した構成について説明しています。簡単な構成があります:

var toolsFactory = new SimpleSerializationToolsFactory();

// Register your config class
toolsFactory.Configurations.Add(new PersonConfig());

// If you want to use property encryption you must register your implementation of IPropertyEncryption, e.g.:
toolsFactory.EncryptionAlgorithm = new Base64PropertyEncryption(); 

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer(toolsFactory);

次に、オブジェクトをシリアル化できます。

var obj = new Person {Name = "John", Password = "Ab238ds2"};
var xml = serializer.Serialize(obj);

xml は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<Person type="ExtendedXmlSerialization.Samples.Encrypt.Person">
    <Name>John</Name>
    <Password>QWIyMzhkczI=</Password>
</Person>

ExtendedXmlSerializer には他にも多くの便利な機能があります。

  • 標準 XMLSerializer からの逆シリアル化 xml
  • プロパティ インターフェイスを持つシリアル化クラス
  • シリアライゼーションの循環参照と参照 ID
  • 古いバージョンの xml の逆シリアル化
  • プロパティの暗号化
  • カスタムシリアライザ

ExtendedXmlSerializer は、.net 4.5 および .net Core をサポートします。WebApi および AspCore と統合できます。

于 2016-11-15T12:58:01.883 に答える
1

MD5など、好きな方法を使用して、パスワードのハッシュ値を保存します。実際のパスワードがメモリやディスクに保存されることは決してありません。次に、認証のために、入力されたクリア テキストのパスワードを取得し、再度ハッシュして、保存されているハッシュと照合します。この方法でも認証は機能しますが、最初のエントリ以外の時点ではパスワードのクリアテキストは使用できません。データを受信して​​から比較のためにハッシュするまでの間、パスワードはメモリ内に存在する必要があるため、最初の入力時にパスワードは攻撃に対して脆弱です。この時間が非常に短いため、攻撃はありそうにありませんが、可能です。

プログラムのこの段階では、ハッシュする前にパスワードを保存するにはSecureStringが適しています。これにより、ハッシュの前にパスワードが自動的に暗号化され、オブジェクトがメモリから削除されるタイミングを指定できるようになります。

サードパーティがハッシュを取得した場合、正しいアルゴリズムでは元に戻せないため、サードパーティにとっては役に立ちません。また、ハッシュを使用してログインしようとすると、プログラムはそれを再度ハッシュし、チェックに失敗します。さらに偏執的になるために、いつでもファイル全体を暗号化することもできます!

これはローカルで発生しているか、ネットワーク接続が暗号化されている (例: https) と想定しています。上記のコメントのとおり、平文のパスワードをネットワーク経由で送信しないでください。

于 2012-04-17T21:02:46.513 に答える