MVC 3在哪里加密用户的密码?

XN1*_*N16 2 encryption entity-framework asp.net-mvc-3

我有自己的密码加密dll,用于登录时检查用户的密码,这在我的用户实体中引用.

现在我已经创建了一个用户注册哪个工作正常,除了密码尚未加密.

我的问题很简单,我应该在哪里加密新用户的密码?我不确定因为我知道用户的密码不应该以纯文本形式传输,因此我不知道调用加密函数的最佳位置在哪里:

  • 用户实体(加密dll已用于验证).
  • 保存用户方法所在的用户存储库.
  • 用户控制器,用于控制用户创建视图.
  • 在其他地方,我没有考虑过!

非常感谢

M. *_*ara 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)));
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

正如Craig Stuntz所指出的,这个例子中的Hash代码非常简单.有关更安全的哈希密码方法,请参阅以下帖子:使用MD5或sha-256 C#哈希密码


Dar*_*rov 5

在服务层方法中,它将负责做两件事:

  1. 调用加密层来散列密码(不加密)
  2. 调用您的用户存储库以使用散列密码将用户实体持久保存到数据库

控制器动作当然会与服务层对话.