如何在安全比赛中使用不安全的代码?

问题描述:

我需要使用SecureString了微软的类,我发现下面的代码在internet如何在安全比赛中使用不安全的代码?

public static class SecureStringExt 
{ 
    public static SecureString ConvertToSecureString(this string password) 
    { 
     if (password == null) 
      throw new ArgumentNullException("password"); 

     unsafe //Red highlighted line 
     { 
      fixed (char* passwordChars = password) 
      { 
       var securePassword = new SecureString(passwordChars, password.Length); 
       securePassword.MakeReadOnly(); 
       return securePassword; 
      } 
     } 
    } 
} 

唯一的问题是,unsafe关键字不断抛出我的错误说Cannot use unsafe construct in safe context。 可惜我找不到为什么会这样......

注: 上面的代码中LINQPad运行,而不是在VS2013(与ReSharper的)。

+5

我不明白为什么你需要在这里使用不安全的,你创建安全的字符串没有不安全的代码。检查我的答案。 – mybirthname 2014-09-20 22:33:13

+2

该文件说你不应该使用该构造函数。请参阅http://msdn.microsoft.com/en-us/library/176bafkd(v=vs.110).aspx使用代码@mybirthname给出的答案 – MicroVirus 2014-09-20 22:39:36

我不确定在这种情况下是否需要不安全的代码(请参阅@mybirthname的答案)。

但是,当需要不安全的代码时,可以在项目属性中启用它。

  • 在主菜单中,单击Project然后<ProjectName> properties...
  • 单击Build页面上。
  • 选择Allow unsafe code

Allow unsafe code

或者一个可以明确指定/unsafe编译器选项。

+0

可以声明吗? – jww 2014-09-20 22:32:42

+0

@jww你是什么意思? – AlexD 2014-09-20 22:37:38

+0

通过使用属性。类似[声明性安全](http://msdn.microsoft.com/en-us/library/kaacwy28%28v=vs.110%29.aspx)。最好根据需要关闭它,而不是在任何地方关掉它。 – jww 2014-09-20 23:31:56

public static SecureString GetSecureString(string password) 
    { 
     SecureString secureString = new SecureString(); 

     foreach (char c in password) 
     { 
      secureString.AppendChar(c); 
     } 

     secureString.MakeReadOnly(); 
     return secureString; 
    } 

您可以在没有不安全代码的情况下做同样的事情。

+0

在这个例子中,你浪费了一个循环。这段代码较慢。 – CodeArtist 2014-11-28 15:14:02

+0

好的,感谢您的意见:) – mybirthname 2014-11-28 15:16:41

+1

注意构造函数[MSDN](https://msdn.microsoft.com/en-us/library/7y8s44by(v = vs.110).aspx)的示例使用非常与循环相似的代码... – 2015-07-22 16:56:37