3

ログイン時にユーザーのパスワードを確認するために使用している独自のパスワード暗号化dllがあります。これは、ユーザーエンティティで参照されます。

これで、パスワードがまだ暗号化されていないことを除けば、ユーザーが登録できるようになりました。

私の質問は非常に単純です。新しいユーザーのパスワードの暗号化をどこに置くべきですか? ユーザーのパスワードをプレーンテキストで送信してはならないことを認識しているため、暗号化機能を呼び出すのに最適な場所がわかりません。

  • ユーザー エンティティ (暗号化 dll が既に検証に使用されている場合)。
  • ユーザー保存メソッドがあるユーザーリポジトリ。
  • ユーザー作成ビューが制御される User コントローラー。
  • 私が考慮していない他の場所!

どうもありがとう

4

4 に答える 4

6

まず第一に、クライアントとサーバーの通信では、機密情報 (パスワードなど) がプレーン テキスト形式で転送されないように SSL を使用することをお勧めします。

その後、パスワードをどこにも保存しないのが一般的な方法です (暗号化されていても、パスワードのハッシュ値は.

パスワードプロパティのsetメソッドにハッシュ関数を入れることができます。次に例を示します。

public class Member
{
    private string _username;

    public string Username
    {
        get { return _username; }
        set { _username = value.ToLowerInvariant(); }
    }

    public string Passhash {get;set;}

    public void SetPassword(string password)
    {
        Passhash = Crypto.Hash(password);
    }

    public bool CheckPassword(string password)
    {
        return string.Equals(Passhash, Crypto.Hash(password));
    }
}

public static class Crypto
{
    public static string Hash(string value)
    {
        return Convert.ToBase64String(
            System.Security.Cryptography.SHA256.Create()
            .ComputeHash(Encoding.UTF8.GetBytes(value)));
    }
}

編集:

Craig Stuntz が指摘したように、この例の Hash コードは非常に単純です。パスワードをより安全にハッシュする方法については、次の投稿を参照してください: MD5 または sha-256 C# を使用したパスワードのハッシュ

于 2012-08-17T17:53:40.780 に答える
5

2 つのことを担当するサービス レイヤー メソッドで:

  1. 暗号化レイヤーを呼び出してパスワードをハッシュします (暗号化しないでください) 。
  2. ユーザー リポジトリを呼び出して、ハッシュされたパスワードを使用してユーザー エンティティをデータベースに永続化します。

もちろん、コントローラー アクションはサービス レイヤーと対話します。

于 2012-08-17T17:53:28.543 に答える
3

独自のパスワード ハッシュを行わないでください。また、パスワードの暗号化についても考えないでください。

これを安全にするための努力は途方もないものです。公開されている仕様とアルゴリズムに基づく既存の方法を使用します。

于 2012-08-17T19:31:12.173 に答える
0
//ENCODE

public string base64Encode(string sData)
{
try
{
byte[] encData_byte = new byte[sData.Length];

encData_byte = System.Text.Encoding.UTF8.GetBytes(sData);

string encodedData = Convert.ToBase64String(encData_byte);

return encodedData;

}
catch(Exception ex)
{
throw new Exception("Error in base64Encode" + ex.Message);
}
}

//DECODE

public string base64Decode(string sData)
    {
        try
        {
            System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();

            System.Text.Decoder utf8Decode = encoder.GetDecoder();

            byte[] todecode_byte = Convert.FromBase64String(sData);

            int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);

            char[] decoded_char = new char[charCount];

            utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);

            string result = new String(decoded_char);

            return result;
        }
        catch (Exception ex)
        {
            throw new Exception("Error in base64Decode" + ex.Message);
        }
    }

How to call 

string encode= base64Encode(val);

string decode= base64Decode(val);


This is very helpful to decode and encode your string(password)
于 2015-12-02T05:51:40.513 に答える