【问题标题】:Can password be stored in plain text as long as its in memory, and not persisted in database, files etc.?密码可以在内存中以纯文本形式存储,而不是在数据库、文件等中持久化吗?
【发布时间】:2014-02-25 23:03:56
【问题描述】:

请看下面的代码sn-ps(一个有敏感数据,比如明文密码,另一个加密明文)。我了解如果将这些内容持久化在文件或数据库等中,需要采取预防措施,例如设置 ACL 等,以便攻击者无法轻易获取它们。

但是,如果不需要保留密码怎么办:

  1. 方法 2 真的比方法 1 更好,因为密码只在内存中吗?或者,有没有必要?或者,是否有可能有人可以读取内存以获取密码 - 始终建议在内存中或持久化时进行加密?

  2. 如果对象被序列化并跨应用程序域传递怎么办? (请注意,我理解如果密码是通过 HTTP(网络)发送的,它需要加密,但如果它只是跨应用程序域,我可以发送纯密码吗?

问候,

纯文本密码代码sn-p

  [Serializable]
    class PlainTextPassword
    {
        //Password stored in plain text
        private string _plainTextPassword = null;
        public PlainTextPassword(string password)
        {
            this._plainTextPassword = password;
        }        
        public string Password
        {
            get
            {
                return this._plainTextPassword;
            }
        }
    }

加密密码sn-p

 [Serializable]
    class EncryptedPassword
    {
        //Encrypted password
        private string _encryptedPassword = null;
        public EncryptedPassword(string password)
        {
            byte[] encryptedPassword = ProtectedData.Protect(System.Text.Encoding.Unicode.GetBytes(password), null, DataProtectionScope.CurrentUser);
            this._encryptedPassword = System.Text.Encoding.Unicode.GetString(encryptedPassword);
        }
        public string Password
        {
            get
            {
                return this._encryptedPassword;
            }
        }        
    }

【问题讨论】:

    标签: c# .net security


    【解决方案1】:

    就内存快照而言,方法 2) 并不比 1) 更安全。您无法控制 GC 何时释放原始密码(因为您几乎无法控制 GC) - 因此,如果您要针对内存快照采取安全措施,请查看

    SecureString
    

    参考: http://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx

    至于可以拍摄内存快照的工具,请查看一些分析器(如 Dynatrace)。

    【讨论】:

    • 但同样的理论,即使它存储为安全字符串,也必须转换为纯文本 - 例如,需要跨应用程序域移动它(需要转换为纯文本,作为安全字符串不会跨越应用程序域),还是使用它连接到 Web 服务器等?这意味着,一个人可以在瞬间拍摄快照并且仍然会遇到同样的问题?不是吗?或者,我错过了什么?
    • @Dreamer 一些 API 将采用安全字符串,但主要是关于减少攻击面 - 如果您的密码仅在几秒钟内以明文形式显示,这比以明文形式显示密码有了很大的改进在应用程序的整个生命周期内。
    • @RB,谢谢。这是否意味着安全字符串比我使用 DPAPI 存储在代码 sn-p 2 中的加密字符串安全得多?换句话说,我也可以使用方法 2 来减小攻击面?
    • 我想我明白了 'msdn 说:请注意,SecureString 没有检查、比较或转换 SecureString 值的成员。此类成员的缺席有助于保护实例的价值免受意外或恶意暴露。谢谢。
    猜你喜欢
    • 2020-03-16
    • 2011-04-02
    • 2016-07-26
    • 2013-10-30
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多