C# 如何在方法中将密码作为参数传递

C# 如何在方法中将密码作为参数传递,c#,string,passwords,C#,String,Passwords,下面的login()方法接受两个参数:用户名和密码。我计划在另一个类中使用此方法,但我不确定向方法传递密码时是否有任何约定。我应该为密码使用不同的数据类型吗?当我尝试调用该方法时,我是否正确地使用了它 class Libary { public string login(string username, string password) { externalObject.WriteLine("login {0} {1}", username, passwor

下面的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);
     }

}

如果您需要使用密码,通常可以。在某些情况下,将它们保留为
char[]
可能很有用,这样它们可以在之后很容易地被覆盖(零),或者作为
SecureString
——但坦率地说,这两种方法都只在运行代码的机器已经完全受损的非常特定的情况下有用,他们所做的只是让攻击者更不方便。所以在大多数实际情况下:
string
就可以了


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

如果你需要使用密码,通常可以。在某些情况下,将它们保留为
char[]
可能很有用,这样它们可以在之后很容易地被覆盖(零),或者作为
SecureString
——但坦率地说,这两种方法都只在运行代码的机器已经完全受损的非常特定的情况下有用,他们所做的只是让攻击者更不方便。所以在大多数实际情况下:
string
就可以了


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

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

类库 {


同意Marc Gravell你应该使用SecureString。你可以使用下面的代码

类库 {


有一个很好的解释和一个链接,其中讨论了SecureString的有用性。这还取决于目标平台是否可以使用SecureString。我明白了,感谢您的详细解释和提示!有一个很好的解释和一个链接,其中讨论了SecureString的有用性。这还取决于目标平台SecureString可以使用也可以不使用。我明白了,谢谢你的透彻解释和提示!这非常有用,谢谢你!我实际上正在寻找一种方法来实现这一点。实际上,人们试图尽快使用SecureString,首先将它放在一个字符串中,但不知何故忽略了SecureString的用途,理想情况下,这种转换sn完全没有必要。例如,提供了一个SecureString,通过一些技巧,您甚至可以绑定到此属性,从而完全避免在字符串中包含密码。@martinstoeckli
SecureString
不安全;当然,这会使它更不方便(使用内存扫描程序无法轻松地发现它们),但是:一旦找到它们,它们是完全可逆的,并且.NET感知工具可以做与GC相同的事情(或“SOS”)查找对象及其类型。如果有的话,可以更轻松地查找对象,因为您知道任何
SecureString
可能都很有趣,而
string
的情况并非如此。但是:在所有这些情况下(were
SecureString
都是相关的):该框已被破坏。您已经输了。@MarcGravel-是的,我知道(并投票赞成您的答案),只是想指出,使用SecureString并首先在字符串中包含密码,忽略了我们在其他情况下可能具有的小优势(无需等待carbage收集器的确定性行为)。@thecodeexplorer define“好的”?你在保护什么威胁?不知道“来自什么”就谈安全是不可能的"。在任何情况下,
string
都会出现问题,整个机器都会受损,并且所有赌注都已下注-除非您有非常具体的想法。这非常有用,谢谢!我实际上正在寻找一种方法来做到这一点。实际上,有人会尽快尝试使用SecureString,以字符串开头不要以某种方式忽略SecureString的用途,理想情况下,这种转换是完全没有必要的。例如,提供了SecureString,并且使用一些技巧,您甚至可以绑定到此属性,从而完全避免在字符串中包含密码。@martinstoeckli
SecureString
不安全;当然,这会使它更不方便(使用内存扫描器无法很容易地发现它们),但是:一旦找到它们,它们是完全可逆的,并且.NET感知工具可以做与GC相同的事情(或“SOS”)查找对象及其类型。如果有的话,可以更轻松地查找对象,因为您知道任何
SecureString
可能都很有趣,而
string
的情况并非如此。但是:在所有这些情况下(were
SecureString
都是相关的):该框已被破坏。您已经输了。@MarcGravel-是的,我知道(并投票赞成您的答案),只是想指出,使用SecureString并首先在字符串中包含密码,忽略了我们在其他情况下可能具有的小优势(无需等待carbage收集器的确定性行为)。@thecodeexplorer define“OK”?你在保护什么威胁?在不知道“来自什么”的情况下谈论安全是不可能的。在任何情况下,
string
都会成为一个问题,整个机器都会被破坏,所有赌注都已经取消-除非你有非常具体的想法
    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));
    }

}