Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC 3在何处加密用户';谁的密码?_Asp.net Mvc 3_Entity Framework_Encryption - Fatal编程技术网

Asp.net mvc 3 MVC 3在何处加密用户';谁的密码?

Asp.net mvc 3 MVC 3在何处加密用户';谁的密码?,asp.net-mvc-3,entity-framework,encryption,Asp.net Mvc 3,Entity Framework,Encryption,我有自己的密码加密dll,用于在用户登录时检查其密码,这在我的用户实体中引用 现在,我已经为用户创建了注册功能,除了密码尚未加密外,该功能运行良好 我的问题很简单,我应该把新用户密码的加密放在哪里?我不确定,因为我知道用户的密码不应该以纯文本传输,因此我不知道调用加密功能的最佳位置: 用户实体(其中加密dll已用于验证) 保存用户方法的用户存储库 控制用户创建视图的用户控制器 我没有考虑过的其他地方 非常感谢服务层方法,它将负责完成两件事: 调用加密层以散列密码(不加密密码) 调用用户存储库

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

现在,我已经为用户创建了注册功能,除了密码尚未加密外,该功能运行良好

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

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

非常感谢服务层方法,它将负责完成两件事:

  • 调用加密层以散列密码(不加密密码)
  • 调用用户存储库以使用哈希密码将用户实体持久化到数据库

  • 控制器操作当然会与服务层对话。

    首先,对于客户机-服务器通信,我建议您对敏感信息(如密码)使用SSL,不要以纯文本格式传输

    之后,通常的做法是不在任何地方保存密码(即使使用加密,也要保存密码的散列值)

    您可以将散列函数放在password属性的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所指出的,本例中的哈希代码非常简单。请参阅下面的帖子,以获得更安全的密码哈希方法:

    不要自己进行密码哈希,甚至不要考虑加密密码


    要确保安全,需要付出巨大的努力。请使用基于公开规范和算法的现有方法。

    非常感谢,我喜欢这个答案,但是我使用的是实体框架,一旦我将密码属性更改为密码类而不是字符串,它将不会从数据库中获取数据,这使得se.你知道如何解决这个问题吗?非常感谢。再做一些调整,一切都会按预期进行!如果你使用的是非盐SHA,不要自欺欺人地说你比存储纯文本要好得多。使用现成的、基于bcrypt的系统。
    //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)