【问题标题】:How to pass passwords as parameters in a method如何在方法中将密码作为参数传递
【发布时间】:2018-10-21 14:33:58
【问题描述】:

我有下面的方法 login() 接受两个参数,用户名和密码。我计划在另一个类中使用此方法,但我不确定将密码传递给方法时是否有任何约定。我应该为密码使用不同的数据类型吗?当我尝试调用该方法时,我是否正确使用它?

class Libary {

    public string login(string username, string password) {
              externalObject.WriteLine("login {0} {1}", username, password);
              string response = externalObject.Execute();
              return response;
    }

}

class HomePage {

     public string callLoginMethod(){
               string username = "dummyUsername";
               string password = "dummyPassword";

               Library library = new Library();
               string output = library.login(username, password);
     }

}

【问题讨论】:

    标签: c# string passwords


    【解决方案1】:

    同意 Marc Gravell 的观点,您应该使用 SecureString。您可以使用下面的代码

    类库 {

        public string login(System.Security.SecureString username, System.Security.SecureString password)
        {
            externalObject.WriteLine("login {0} {1}", username, password);
            string response = externalObject.Execute();
            return response;
        }
    
    }
    
    class SecureLibrary {
    
        public System.Security.SecureString GetSecureString(string text)
        {
            System.Security.SecureString strSecure = new System.Security.SecureString();
            foreach (char c in text)
            {
                strSecure.AppendChar(c);
            }
            return strSecure;
        }
    }
    
    class HomePage
    {
    
        public string callLoginMethod()
        {
            string username = "dummyUsername";
            string password = "dummyPassword";
    
            Library library = new Library();
            SecureLibrary seclib = new SecureLibrary();
            string output = library.login(seclib.GetSecureString(username), seclib.GetSecureString(password));
        }
    
    }
    

    【讨论】:

    • 这很有帮助,谢谢!我实际上是在寻找一种方法来做到这一点。
    • 实际上人们会尽快尝试使用 SecureString,首先将它放在一个字符串中不知何故忽略了 SecureString 的目的,理想情况下这种转换根本没有必要。例如,PasswordBox 提供了一个 SecureString,通过一些技巧,您甚至可以绑定到该属性,从而完全避免在字符串中包含密码。
    • @martinstoeckli SecureString 不安全;当然,它更不方便(你不能用内存扫描器很容易地发现它们),但是:一旦找到它们,它们是完全可逆的,并且 . NET 感知工具可以执行与 GC(或“SOS”)相同的操作来查找对象及其类型。如果有的话,它会更容易找到它们,因为您知道任何 SecureString 都可能很有趣,string 的情况并非如此。但是:在所有这些情况下(SecureString 是否相关):盒子已经被破坏了。你已经输了
    • @MarcGravell - 是的,我知道(并投票支持您的答案),只是想指出,使用 SecureString 并首先将密码包含在字符串中,忽略了我们原本拥有的小优势(确定性行为而无需等待碳水化合物收集器)。
    • @thecodeexplorer 定义“OK”?你在保护什么威胁?不知道“从什么”就不可能谈论安全。在string 会成为问题的任何情况下,整个机器都会受到威胁,并且所有赌注都已经关闭 - 除非您有非常具体的想法
    【解决方案2】:

    如果您需要使用密码,那通常没问题。 在某些情况下,将它们保留为 char[] 可能会很有用,以便之后可以轻松地覆盖(置零)或 SecureString - 但坦率地说,这两种情况都只会有帮助在运行代码的机器已经完全被攻破的非常特殊的场景中,他们所做的只是让攻击者更加不方便。所以在大多数现实世界的情况下:string 很好。

    当然,如果您可以避免完全了解纯文本密码(证书、Windows 身份验证、应用程序密钥等),那么这可能是避免问题的一种方法。

    【讨论】:

    • SecureString 有一个很好的解释,还有一个链接讨论了它的用处。是否可以使用 SecureString 也取决于目标平台。
    • 我明白了,感谢您的详尽解释和提示!
    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 2011-10-14
    • 2015-08-19
    • 2010-10-16
    • 2013-08-10
    • 2021-04-17
    相关资源
    最近更新 更多