2014-09-20 203 views
22

我需要使用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

回答

45

我不確定在這種情況下是否需要不安全的代碼(請參閱@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

9
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