<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnet.org.za/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Mark Nicholson</title><link>http://dotnet.org.za/markn/default.aspx</link><description>public class Universe { public Universe(params object[] values) { throw new NotSupportedException(); } }</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>Marshaling SecureString Passwords to String</title><link>http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx</link><pubDate>Sat, 04 Oct 2008 06:56:25 GMT</pubDate><guid isPermaLink="false">2d3a9e08-b70c-4031-ba2b-8f5282a2a59a:701985</guid><dc:creator>markn</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.org.za/markn/rsscomments.aspx?PostID=701985</wfw:commentRss><comments>http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx#comments</comments><description>&lt;p&gt;You should always use a System.Security.SecureString when creating .NET APIs that handle passwords. Unfortunately many of the .NET Framework APIs do not yet use System.Security.SecureString. This will change in the future, but for now, how do you handle the marshaling of a System.Security.SecureString to an API that uses System.String without leaving traces of the password all over memory. Here is one work-around for this problem.&lt;/p&gt;  &lt;p&gt;First off, what is wrong with using System.String to represent passwords:&lt;/p&gt;  &lt;p&gt;1. The GC is free to move the System.String around in memory (unknown to the developer). When moving the memory buffer around in memory, copies of the string are left all over the now free areas of the process memory. For efficiency, the GC does not zero the memory that it frees. So even though your code may only have &amp;#39;one copy&amp;#39; of the string, in memory there could be thousands of copies of the string that are no longer accessible by a reference or pointer and will remain there until that memory is used for something else and gets overwritten.&lt;/p&gt;  &lt;p&gt;2. Whenever you perform some System.String manipulation, a new System.String is created. This is because System.String is immutable. Thus, if I append characters onto a System.String in order to build up a password, pieces of the password are left all over the process memory by the temporary strings that are created.&lt;/p&gt;  &lt;p&gt;An example of a .NET Framework API that should use a System.Security.SecureString to represent a password, but instead uses a System.String, is the WCF System.ServiceModel.Security.UserNamePasswordClientCredential.Password property. There are many examples of this in the .NET Framework. One in particular that relates to a post below about the SQL OPEN { MASTER | SYMMETRIC } KEY relates to ADO.NET not accepting a System.Security.SecureString as a mapable type to a string-based parameter. This means that all passwords sent to the database via ADO.NET must be System.String.&lt;/p&gt;  &lt;p&gt;There is some good news though, the System.Diagnostics.Process class uses a System.Security.SecureString to represent the password.&lt;/p&gt;  &lt;p&gt;So, how do we marshal a System.Security.SecureString to a System.String temporarily, and then guarantee that traces aren&amp;#39;t left all over the process memory. We need to implement two things:&lt;/p&gt;  &lt;p&gt;1. Guarantee that the .NET GC does not move the System.String around in memory.&lt;/p&gt;  &lt;p&gt;2. Guarantee a deterministic freeing of the string, zeroing out the memory.&lt;/p&gt;  &lt;p&gt;To accomplish the first one, we will pin the string in memory using the System.Runtime.InteropServices.GCHandle class.&lt;/p&gt;  &lt;p&gt;To accomplish the second, we will use managed pointers (unsafe code) to mutate the System.String and the strong guarantees of the System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup method.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Capture a System.Security.SecureString password from the command line.&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;SecureString password = ConsoleUtility.CapturePassword(&lt;span style="color:#006080;"&gt;&amp;quot;Enter password: &amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;See my post below for the ConsoleUtility code. &lt;a href="http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx" target="_blank"&gt;http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Allocate an &amp;quot;empty&amp;quot; System.String (filled with zeros &amp;#39;\0&amp;#39;) of the correct length.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; length = password.Length;
var insecurePassword = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;, length);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This creates a string filled with the &amp;#39;\0&amp;#39; character for the same length as the password. At this point, the GC is still free to move this string around in memory, leaving copies of it in memory as it goes. We are not concerned with this, because the string does not contain any sensitive information yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Pin the System.String so that the GC cannot move it around in memory.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;GCHandle gch = GCHandle.Alloc(insecurePassword, GCHandleType.Pinned);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Once pinned by a GC handle, the GC cannot move the memory until GCHandle.Free is called.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Marshal the System.Security.SecureString to the pinned System.String.&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; IntPtr passwordPtr = Marshal.SecureStringToBSTR(password);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; var pPassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)passwordPtr;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; var pInsecurePassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)gch.AddrOfPinnedObject();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; length; index++)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     pInsecurePassword[index] = pPassword[index];&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt; Marshal.ZeroFreeBSTR(passwordPtr);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Line 1 marshals the encrypted System.Security.SecureString password to an unmanaged buffer. Line 2 gets the managed pointer to the unmanaged buffer. Line 3 gets the managed pointer to the pinned managed System.String that we are going to copy the password into. Lines 4 to 7 copy the password into the System.String buffer (mutating the immutable string). Line 8 zeros and frees the unmanaged buffer holding the marshaled password.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: This code must be executed in an unsafe context. Place the unsafe keyword around the code or on the method. Enable your assembly to use unsafe code under Properties, Build, Allow unsafe code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;: Use the System.String password.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;Console.WriteLine(insecurePassword);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Here we would pass the System.String to the .NET API that requires a System.String. In this case I just output the password to the console. In a real situation this would be a more useful call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6&lt;/strong&gt;: Deterministically zero the pinned System.String password.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; length; index++)
{
    pInsecurePassword[index] = &lt;span style="color:#006080;"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This overwrites (mutates) the System.String memory with zeros &amp;#39;\0&amp;#39;.&lt;/p&gt;

&lt;p&gt;Verify that the System.String memory has been overwritten.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;Console.WriteLine(insecurePassword);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Step 7&lt;/strong&gt;: Unpin the System.String password.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;gch.Free();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now the System.String is free to be garbage collected by the GC, but the string does not contain any sensitive information, so we don&amp;#39;t care that the string can now move around in memory or that there is a delay before the string is actually GC&amp;#39;ed.&lt;/p&gt;

&lt;p&gt;That is the basic structure of the code. However, there are potential memory leaks in this code in the face of exceptions and asynchronous exceptions such as ThreadAbortException, OutOfMemoryException and StackOverflowException, etc.&lt;/p&gt;

&lt;p&gt;In Step 3, we need to protect the GCHandle.Alloc to ensure that we do not leak a GC handle. An asynchronous exception, such as ThreadAbortException may be thrown after the GCHandle.Alloc method has allocated the handle, but before it is assigned to the variable &amp;#39;gch&amp;#39;, thus leaking the handle. To protect this allocation and the assignment to the variable we use a CER (Constrained Execution Region).&lt;/p&gt;

&lt;p&gt;Step 3 changes to the following code:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; GCHandle gch;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; RuntimeHelpers.PrepareConstrainedRegions();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {} &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     gch = GCHandle.Alloc(insecurePassword, GCHandleType.Pinned);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The try block is not a CER, only the finally block is a CER. You will often see this strange form of a try finally block with RuntimeHelpers.PrepareConstrainedRegions method call directly above the try. This declares a CER for the finally block. A CER cannot be interrupted once entered, even by asynchronous exceptions such as ThreadAbortException, OutOfMemoryException and StackOverflowException. This post is not about CERs, so I won&amp;#39;t go into more detail here. NOTE: CERs should NOT be used in &amp;quot;normal, everyday&amp;quot; code. They should only be used when marshaling to and from unmanaged code or in this edge case, when using GCHandle, because GCHandle requires an explicit free.&lt;/p&gt;

&lt;p&gt;In Step 4, line 1, the Marshal.SecureStringToBSTR method call is also not safe from asynchronous exceptions. Again we require a CER...&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; IntPtr passwordPtr;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; RuntimeHelpers.PrepareConstrainedRegions();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {} &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     passwordPtr = Marshal.SecureStringToBSTR(password);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Finally, we should ensure that the GC handle is freed with GCHandle.Free and the unmanaged pointer is freed with Marshal.ZeroFreeBSTR. To do this, we could use a try/finally, but this does not guarantee that the finally will be executed in the face of asynchronous exceptions. To harden this and ensure we don&amp;#39;t leak GC handles or unmanaged memory, we again use CERs. We should also dispose the System.Security.SecureString to ensure good house-keeping with a using. Here is the final reworked code.&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SecureString password = ConsoleUtility.CapturePassword(&lt;span style="color:#006080;"&gt;&amp;quot;Enter password: &amp;quot;&lt;/span&gt;))&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; length = password.Length;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     var insecurePassword = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;, length);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     var gch = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; GCHandle();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;     RuntimeHelpers.PrepareConstrainedRegions();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;         RuntimeHelpers.PrepareConstrainedRegions();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {} &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;             gch = GCHandle.Alloc(insecurePassword, GCHandleType.Pinned);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;         IntPtr passwordPtr = IntPtr.Zero;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;             RuntimeHelpers.PrepareConstrainedRegions();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {} &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;             {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;                 passwordPtr = Marshal.SecureStringToBSTR(password);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;             }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;             var pPassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)passwordPtr;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;             var pInsecurePassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)gch.AddrOfPinnedObject();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; length; index++)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;             {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;                 pInsecurePassword[index] = pPassword[index];&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;             }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;// Use the password.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt;             Console.WriteLine(insecurePassword);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (passwordPtr != IntPtr.Zero)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt;             {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;                 Marshal.ZeroFreeBSTR(passwordPtr);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt;             }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  41:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  42:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  43:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  44:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  45:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (gch.IsAllocated)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  46:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  47:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;// Zero the string.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  48:&lt;/span&gt;             var pInsecurePassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)gch.AddrOfPinnedObject();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  49:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; length; index++)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  50:&lt;/span&gt;             {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  51:&lt;/span&gt;                 pInsecurePassword[index] = &lt;span style="color:#006080;"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  52:&lt;/span&gt;             }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  53:&lt;/span&gt;             gch.Free();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  54:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  55:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  56:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;[EDIT] There is an error in the code above. Between lines 16 and 17 there should be a RuntimeHelpers.PrepareConstrainedRegions(); method call.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[EDIT] Lines 32 and 33 should come after line 41 to ensure that the unmanaged buffer is freed as early as possible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is still a potential problem with this code. The final finally that zeros and unpins the managed System.String containing the unencrypted password, may never execute in the face of a StackOverflowException.&lt;/p&gt;

&lt;p&gt;To harden this code further we can convert the outer try/finally (CER) to RuntimeHelpers.ExecuteCodeWithGauranteedCleanup method. This guarantees that the cleanup code ALWAYS executes even in the face of a StackOverflowException. Here is the reworked code...&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SecureString password = ConsoleUtility.CapturePassword(&lt;span style="color:#006080;"&gt;&amp;quot;Enter password: &amp;quot;&lt;/span&gt;))&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; length = password.Length;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     var insecurePassword = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;, length);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     var gch = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; GCHandle();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;     RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;             {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;                 RuntimeHelpers.PrepareConstrainedRegions();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {} &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;                 {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;                     gch = GCHandle.Alloc(insecurePassword, GCHandleType.Pinned);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;                 }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;                 IntPtr passwordPtr = IntPtr.Zero;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;                 {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;                     RuntimeHelpers.PrepareConstrainedRegions();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;                     &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {} &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;                     {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;                         passwordPtr = Marshal.SecureStringToBSTR(password);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;                     }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;                     var pPassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)passwordPtr;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;                     var pInsecurePassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)gch.AddrOfPinnedObject();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;                     &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; length; index++)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;                     {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;                         pInsecurePassword[index] = pPassword[index];&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;                     }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt;                     &lt;span style="color:#008000;"&gt;// Use the password.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt;                     Console.WriteLine(insecurePassword);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt;                 }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt;                 {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt;                     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (passwordPtr != IntPtr.Zero)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt;                     {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;                         Marshal.ZeroFreeBSTR(passwordPtr);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt;                     }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  41:&lt;/span&gt;                 }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  42:&lt;/span&gt;             },&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  43:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  44:&lt;/span&gt;             {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  45:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (gch.IsAllocated)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  46:&lt;/span&gt;                 {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  47:&lt;/span&gt;                     &lt;span style="color:#008000;"&gt;// Zero the string.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  48:&lt;/span&gt;                     var pInsecurePassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)gch.AddrOfPinnedObject();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  49:&lt;/span&gt;                     &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; length; index++)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  50:&lt;/span&gt;                     {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  51:&lt;/span&gt;                         pInsecurePassword[index] = &lt;span style="color:#006080;"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  52:&lt;/span&gt;                     }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  53:&lt;/span&gt;                     gch.Free();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  54:&lt;/span&gt;                 }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  55:&lt;/span&gt;             },&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  56:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  57:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;[EDIT] There is an error in the code above. Between lines 16 and 17 there should be a RuntimeHelpers.PrepareConstrainedRegions(); method call.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[EDIT] Lines 32 and 33 should come after line 41 to ensure that the unmanaged buffer is freed as early as possible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We did this extra hardening step to ensure the safety of the password. That is, to ensure that the System.String containing the unencrypted password is ALWAYS zeroed deterministically.&lt;/p&gt;

&lt;p&gt;However, there is still a potential memory leak in that the Marshal.ZeroFreeBSTR may never execute. We can further harden this code by replacing the inner try/finally with RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup, although this is not necessary for the security of the password, only to avoid a memory leak.&lt;/p&gt;

&lt;p&gt;This is the final code listing:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SecureString password = ConsoleUtility.CapturePassword(&lt;span style="color:#006080;"&gt;&amp;quot;Enter password: &amp;quot;&lt;/span&gt;))
{
    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; length = password.Length;
    var insecurePassword = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;, length);

    var gch = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; GCHandle();
    RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(
        &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;
            {
                RuntimeHelpers.PrepareConstrainedRegions();
                &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {} &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;
                {
                    gch = GCHandle.Alloc(insecurePassword, GCHandleType.Pinned);
                }

                IntPtr passwordPtr = IntPtr.Zero;
                RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(
                    &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;
                        {
                            RuntimeHelpers.PrepareConstrainedRegions();
                            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {} &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;
                            {
                                passwordPtr = Marshal.SecureStringToBSTR(password);
                            }

                            var pPassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)passwordPtr;
                            var pInsecurePassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)gch.AddrOfPinnedObject();
                            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; length; index++)
                            {
                                pInsecurePassword[index] = pPassword[index];
                            }
                        },
                    &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;
                        {
                            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (passwordPtr != IntPtr.Zero)
                            {
                                Marshal.ZeroFreeBSTR(passwordPtr);
                            }
                        },
                    &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);

                &lt;span style="color:#008000;"&gt;// Use the password.&lt;/span&gt;
                Console.WriteLine(insecurePassword);
            },
        &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;
            {
                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (gch.IsAllocated)
                {
                    &lt;span style="color:#008000;"&gt;// Zero the string.&lt;/span&gt;
                    var pInsecurePassword = (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)gch.AddrOfPinnedObject();
                    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; length; index++)
                    {
                        pInsecurePassword[index] = &lt;span style="color:#006080;"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;;
                    }
                    gch.Free();
                }
            },
        &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);
}&lt;/pre&gt;
&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx&amp;amp;;subject=Marshaling+SecureString+Passwords+to+String" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx&amp;amp;;title=Marshaling+SecureString+Passwords+to+String" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx&amp;amp;title=Marshaling+SecureString+Passwords+to+String" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx&amp;amp;;title=Marshaling+SecureString+Passwords+to+String" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx&amp;amp;;title=Marshaling+SecureString+Passwords+to+String&amp;amp;;top=1" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/04/handling-passwords.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://dotnet.org.za/aggbug.aspx?PostID=701985" width="1" height="1"&gt;</description><category domain="http://dotnet.org.za/markn/archive/tags/.NET/default.aspx">.NET</category><category domain="http://dotnet.org.za/markn/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://dotnet.org.za/markn/archive/tags/security/default.aspx">security</category><category domain="http://dotnet.org.za/markn/archive/tags/SecureString/default.aspx">SecureString</category><category domain="http://dotnet.org.za/markn/archive/tags/password/default.aspx">password</category><category domain="http://dotnet.org.za/markn/archive/tags/Marshal/default.aspx">Marshal</category></item><item><title>Simple Console Password Capture Utility</title><link>http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx</link><pubDate>Fri, 03 Oct 2008 17:45:10 GMT</pubDate><guid isPermaLink="false">2d3a9e08-b70c-4031-ba2b-8f5282a2a59a:699411</guid><dc:creator>markn</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.org.za/markn/rsscomments.aspx?PostID=699411</wfw:commentRss><comments>http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx#comments</comments><description>&lt;p&gt;For command line utilities, that require capturing a password, you may find this C# utility class to capture a password useful.&lt;/p&gt;  &lt;p&gt;Features:&lt;/p&gt;  &lt;p&gt;1. Allows you to specify a prompt, e.g. &amp;quot;Enter password: &amp;quot;&lt;/p&gt;  &lt;p&gt;2. Caters for masking or unmasking the displayed password, e.g. abc123 or ******&lt;/p&gt;  &lt;p&gt;3. Allows you to specify the masking character, e.g. - instead of *&lt;/p&gt;  &lt;p&gt;4. Caters for a maximum length, or unlimited length passwords.&lt;/p&gt;  &lt;p&gt;5. Caters for processing the backspace key so the user can make corrections.&lt;/p&gt;  &lt;p&gt;6. Uses the System.Security.SecureString class (correctly) to ensure that the password is encrypted in memory.&lt;/p&gt;  &lt;p&gt;Copy this code into a Visual Studio 2008,C# Windows Console Application Project, Program.cs file.&lt;/p&gt;  &lt;div&gt;   &lt;div&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.CompilerServices;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.InteropServices;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Security;

&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; TestConsoleUtility
{
    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Extensions to the &amp;lt;see cref=&amp;quot;Console&amp;quot;/&amp;gt; class.&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ConsoleUtility
    {
        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Captures an encrypted password from the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// No prompt message is displayed to the user.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The password may be any length.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The characters entered by the user are replaced by the &amp;#39;*&amp;#39; character&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// for improved security.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The user may use the backspace key to make corrections while &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capturing the password.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;A &amp;lt;see cref=&amp;quot;SecureString&amp;quot;/&amp;gt; containing the encrypted &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password.&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; SecureString CapturePassword()
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CapturePassword(&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, -1, &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;);
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Captures an encrypted password from the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The password may be any length.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The characters entered by the user are replaced by the &amp;#39;*&amp;#39; character&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// for improved security.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The user may use the backspace key to make corrections while &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capturing the password.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/remarks&amp;gt; &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;prompt&amp;quot;&amp;gt;The message to show to the user on the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;A &amp;lt;see cref=&amp;quot;SecureString&amp;quot;/&amp;gt; containing the encrypted &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password.&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; SecureString CapturePassword(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prompt)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CapturePassword(prompt, -1, &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;);
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Captures an encrypted password from the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The password may be any length.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// If the &amp;lt;paramref name=&amp;quot;useMask&amp;quot;/&amp;gt; parameter is true, the characters&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// entered by the user are replaced by the &amp;#39;*&amp;#39; character for improved &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// security.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The user may use the backspace key to make corrections while &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capturing the password.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/remarks&amp;gt; &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;prompt&amp;quot;&amp;gt;The message to show to the user on the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;useMask&amp;quot;&amp;gt;true, if the characters typed by the user &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// should be replaced by the &amp;#39;*&amp;#39; character, otherwise false.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;A &amp;lt;see cref=&amp;quot;SecureString&amp;quot;/&amp;gt; containing the encrypted &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password.&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; SecureString CapturePassword(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prompt, &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; useMask)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CapturePassword(prompt, -1, useMask, &lt;span style="color:#006080;"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;);
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Captures an encrypted password from the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The password may be any length.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// If the &amp;lt;paramref name=&amp;quot;useMask&amp;quot;/&amp;gt; parameter is true, the characters&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// entered by the user are replaced by the &amp;lt;paramref name=&amp;quot;mask&amp;quot;/&amp;gt; &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// character for improved security.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The user may use the backspace key to make corrections while &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capturing the password.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/remarks&amp;gt; &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;prompt&amp;quot;&amp;gt;The message to show to the user on the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;useMask&amp;quot;&amp;gt;true, if the characters typed by the user &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// should be replaced by the &amp;lt;paramref name=&amp;quot;mask&amp;quot;/&amp;gt; character, &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// otherwise false.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;mask&amp;quot;&amp;gt;The character to replace the characters typed by&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// the user with, if the &amp;lt;paramref name=&amp;quot;useMask&amp;quot;/&amp;gt; parameter is true.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;A &amp;lt;see cref=&amp;quot;SecureString&amp;quot;/&amp;gt; containing the encrypted &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password.&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; SecureString CapturePassword(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prompt, 
            &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; useMask, &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; mask)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CapturePassword(prompt, -1, useMask, mask);
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Captures an encrypted password from the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// If the &amp;lt;paramref name=&amp;quot;maxLength&amp;quot;/&amp;gt; parameter is set to -1, the &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password can be any length.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The characters entered by the user are replaced by the &amp;#39;*&amp;#39; character&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// for improved security.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The user may use the backspace key to make corrections while &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capturing the password.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;exception cref=&amp;quot;ArgumentOutOfRangeException&amp;quot;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;paramref name=&amp;quot;maxLength&amp;quot;/&amp;gt; is less than -1.&amp;lt;/exception&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;prompt&amp;quot;&amp;gt;The message to show to the user on the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;maxLength&amp;quot;&amp;gt;The maximum length of the password to &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capture. Specify -1 for infinite.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;A &amp;lt;see cref=&amp;quot;SecureString&amp;quot;/&amp;gt; containing the encrypted &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password.&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; SecureString CapturePassword(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prompt, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; maxLength)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CapturePassword(prompt, maxLength, &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;);
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Captures an encrypted password from the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// If the &amp;lt;paramref name=&amp;quot;maxLength&amp;quot;/&amp;gt; parameter is set to -1, the &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password can be any length.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// If the &amp;lt;paramref name=&amp;quot;useMask&amp;quot;/&amp;gt; parameter is true, the characters&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// entered by the user are replaced by the &amp;#39;*&amp;#39; character for improved &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// security.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The user may use the backspace key to make corrections while &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capturing the password.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;exception cref=&amp;quot;ArgumentOutOfRangeException&amp;quot;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;paramref name=&amp;quot;maxLength&amp;quot;/&amp;gt; is less than -1.&amp;lt;/exception&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;prompt&amp;quot;&amp;gt;The message to show to the user on the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;maxLength&amp;quot;&amp;gt;The maximum length of the password to &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capture. Specify -1 for infinite.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;useMask&amp;quot;&amp;gt;true, if the characters typed by the user &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// should be replaced by the &amp;#39;*&amp;#39; character, otherwise false.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;A &amp;lt;see cref=&amp;quot;SecureString&amp;quot;/&amp;gt; containing the encrypted &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password.&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; SecureString CapturePassword(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prompt, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; maxLength,
            &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; useMask)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CapturePassword(prompt, maxLength, useMask, &lt;span style="color:#006080;"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;);
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Captures an encrypted password from the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// If the &amp;lt;paramref name=&amp;quot;maxLength&amp;quot;/&amp;gt; parameter is set to -1, the &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password can be any length.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// If the &amp;lt;paramref name=&amp;quot;useMask&amp;quot;/&amp;gt; parameter is true, the characters&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// entered by the user are replaced by the &amp;lt;paramref name=&amp;quot;mask&amp;quot;/&amp;gt; &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// character for improved security.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// The user may use the backspace key to make corrections while &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capturing the password.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;exception cref=&amp;quot;ArgumentOutOfRangeException&amp;quot;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;paramref name=&amp;quot;maxLength&amp;quot;/&amp;gt; is less than -1.&amp;lt;/exception&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;prompt&amp;quot;&amp;gt;The message to show to the user on the console.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;maxLength&amp;quot;&amp;gt;The maximum length of the password to &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// capture. Specify -1 for infinite.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;useMask&amp;quot;&amp;gt;true, if the characters typed by the user &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// should be replaced by the &amp;lt;paramref name=&amp;quot;mask&amp;quot;/&amp;gt; character, &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// otherwise false.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;mask&amp;quot;&amp;gt;The character to replace the characters typed by&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// the user with, if the &amp;lt;paramref name=&amp;quot;useMask&amp;quot;/&amp;gt; parameter is true.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;A &amp;lt;see cref=&amp;quot;SecureString&amp;quot;/&amp;gt; containing the encrypted &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// password.&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; SecureString CapturePassword(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prompt, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; maxLength,
            &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; useMask, &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; mask)
        {
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (maxLength &amp;lt; -1)
            {
                &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArgumentOutOfRangeException(&lt;span style="color:#006080;"&gt;&amp;quot;maxLength&amp;quot;&lt;/span&gt;);
            }

            var password = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SecureString();

            &lt;span style="color:#008000;"&gt;// Output the prompt message.&lt;/span&gt;
            Console.Write(prompt);

            &lt;span style="color:#008000;"&gt;// Read in the password character by character until &amp;lt;Enter&amp;gt; is hit.&lt;/span&gt;
            ConsoleKeyInfo consoleKeyInfo;
            &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; ((consoleKeyInfo = Console.ReadKey(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)).Key != 
                ConsoleKey.Enter)
            {
                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (consoleKeyInfo.Key == ConsoleKey.Backspace)
                {
                    &lt;span style="color:#008000;"&gt;// Process the backspace key.&lt;/span&gt;
                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (password.Length &amp;gt; 0)
                    {
                        &lt;span style="color:#008000;"&gt;// Remove a character from the encrypted password.&lt;/span&gt;
                        password.RemoveAt(password.Length - 1);

                        &lt;span style="color:#008000;"&gt;// Remove the last mask character from the console.&lt;/span&gt;
                        Console.Write(consoleKeyInfo.KeyChar);
                        Console.Write(&lt;span style="color:#006080;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;);
                        Console.Write(consoleKeyInfo.KeyChar);
                    }
                }
                &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
                {
                    &lt;span style="color:#008000;"&gt;// Process a password character.&lt;/span&gt;
                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (maxLength == -1 || password.Length &amp;lt; maxLength)
                    {
                        password.AppendChar(consoleKeyInfo.KeyChar);
                        &lt;span style="color:#008000;"&gt;// Write out the masked character or actual character.&lt;/span&gt;
                        Console.Write(useMask ? mask : consoleKeyInfo.KeyChar);
                    }
                }
            }

            Console.WriteLine();

            &lt;span style="color:#008000;"&gt;// Prevent further changes to the encrypted password.&lt;/span&gt;
            password.MakeReadOnly();
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; password;
        }
    }

    &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Program
    {
        &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main()
        {
            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var password = ConsoleUtility.CapturePassword(
                &lt;span style="color:#006080;"&gt;&amp;quot;Enter password: &amp;quot;&lt;/span&gt;))
            {
                IntPtr passwordPtr = IntPtr.Zero;
                &lt;span style="color:#008000;"&gt;// Execute with guaranteed cleanup to ensure we do not leave&lt;/span&gt;
                &lt;span style="color:#008000;"&gt;// a clear text password in the process memory, even in the face&lt;/span&gt;
                &lt;span style="color:#008000;"&gt;// of an asynchronous exception such as ThreadAbortException, &lt;/span&gt;
                &lt;span style="color:#008000;"&gt;// OutOfMemoryException or StackOverflowException.&lt;/span&gt;
                RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(
                    &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;
                    {
                        &lt;span style="color:#008000;"&gt;// Execute in a CER to guarantee that we do not leak the&lt;/span&gt;
                        &lt;span style="color:#008000;"&gt;// pointer in the face of asynchronous exceptions such as &lt;/span&gt;
                        &lt;span style="color:#008000;"&gt;// ThreadAbortException.&lt;/span&gt;
                        RuntimeHelpers.PrepareConstrainedRegions();
                        &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; { }
                        &lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;
                        {
                            passwordPtr = Marshal.SecureStringToBSTR(password);
                        }

                        &lt;span style="color:#008000;"&gt;// TODO: Do something useful with the password. &lt;/span&gt;
                    },
                    &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;
                    {
                        &lt;span style="color:#008000;"&gt;// Zero and free the memory.&lt;/span&gt;
                        &lt;span style="color:#008000;"&gt;// This is guaranteed to always execute,&lt;/span&gt;
                        &lt;span style="color:#008000;"&gt;// even in the face of asynchronous exceptions.&lt;/span&gt;
                        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (passwordPtr != IntPtr.Zero)
                        {
                            Marshal.ZeroFreeBSTR(passwordPtr);
                        }
                    },
                    &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);
            }
        }
    }
}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx&amp;amp;;subject=Simple+Console+Password+Capture+Utility" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx&amp;amp;;title=Simple+Console+Password+Capture+Utility" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx&amp;amp;title=Simple+Console+Password+Capture+Utility" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx&amp;amp;;title=Simple+Console+Password+Capture+Utility" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx&amp;amp;;title=Simple+Console+Password+Capture+Utility&amp;amp;;top=1" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/simple-console-password-capture-utility.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://dotnet.org.za/aggbug.aspx?PostID=699411" width="1" height="1"&gt;</description><category domain="http://dotnet.org.za/markn/archive/tags/.NET/default.aspx">.NET</category><category domain="http://dotnet.org.za/markn/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://dotnet.org.za/markn/archive/tags/security/default.aspx">security</category><category domain="http://dotnet.org.za/markn/archive/tags/SecureString/default.aspx">SecureString</category><category domain="http://dotnet.org.za/markn/archive/tags/password/default.aspx">password</category><category domain="http://dotnet.org.za/markn/archive/tags/Console/default.aspx">Console</category></item><item><title>SQL 2005/2008 OPEN { MASTER | SYMMETRIC } KEY Password Parameterization</title><link>http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx</link><pubDate>Fri, 03 Oct 2008 16:49:30 GMT</pubDate><guid isPermaLink="false">2d3a9e08-b70c-4031-ba2b-8f5282a2a59a:699227</guid><dc:creator>markn</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.org.za/markn/rsscomments.aspx?PostID=699227</wfw:commentRss><comments>http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx#comments</comments><description>&lt;p&gt;Be careful when using passwords with OPEN MASTER KEY and OPEN SYMMETRIC KEY on SQL Server 2005 &amp;amp; 2008. The password is vulnerable to SQL injection attacks, unless you escape all single-quote characters (&amp;#39;), with two single quote characters. This is because the DDL syntax for the OPEN MASTER KEY and OPEN SYMMETRIC KEY SQL statements do not accept parameters for the password.&lt;/p&gt;  &lt;p&gt;Consider the following SQL statement to open a symmetric key, decrypting it by a certificate that is protected by a password:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;OPEN SYMMETRIC KEY [MyKey] DECRYPTION BY CERTIFICATE [MyCert] WITH PASSWORD = &amp;#39;&amp;lt;password&amp;gt;&amp;#39;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Since OPEN ... KEY SQL statements do not accept parameters, you need to formulate the SQL string as inline-SQL. Assuming your password is &amp;#39;abc123&amp;#39;, your SQL statement will look something like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;OPEN SYMMETRIC KEY [MyKey] DECRYPTION BY CERTIFICATE [MyCert] WITH PASSWORD = &amp;#39;abc123&amp;#39;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Nothing wrong there.&lt;/p&gt;  &lt;p&gt;Now assume we select a password of [&amp;#39;;SELECT &amp;#39;SQL INJECTION&amp;#39;;--] (excluding the square brackets []), your SQL statement will look as follows:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;OPEN SYMMETRIC KEY [MyKey] DECRYPTION BY CERTIFICATE [MyCert] WITH PASSWORD = &amp;#39;&amp;#39;;SELECT &amp;#39;SQL INJECTION&amp;#39;;--&amp;#39;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This does not open the SYMMETRIC KEY, but instead executes a SELECT statement that returns the value &amp;#39;SQL INJECTION&amp;#39;.&lt;/p&gt;  &lt;p&gt;Now imagine a somewhat worse choice of password such as [&amp;#39;;DROP DATABASE pubs;&amp;#39;] (excluding the square brackets []).&lt;/p&gt;  &lt;p&gt;Given that the primary use-case for specifying a password on OPEN ... KEY is to use a secret that is not stored in the database, for example to prevent dbo or sysadmin users from getting access to the data, this string would typically be executed from your application code. Since the statement does not accept parameters, you need to formulate this as an inline-SQL string in your code. Therefore you need to enforce that you escape all single-quotes in the password in your code. For example:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;OPEN SYMMETRIC KEY [MyKey] DECRYPTION BY CERTIFICATE [MyCert] WITH PASSWORD = &amp;#39;&amp;#39;&amp;#39;;SELECT &amp;#39;&amp;#39;SQL INJECTION&amp;#39;&amp;#39;;--&amp;#39;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Now the password is the literal text [&amp;#39;;SELECT &amp;#39;SQL INJECTION&amp;#39;;--] (excluding square brackets []) and the injected SELECT statement is not executed.&lt;/p&gt;  &lt;p&gt;I&amp;#39;ve requested a feature from Microsoft to allow parameters on all DDL SQL statements that require passwords. Microsoft is currently considering adding this feature to improve security.&lt;/p&gt;  &lt;p&gt;To vote on this feature request, please visit: &lt;a title="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=369270" href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=369270"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=369270&lt;/a&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx&amp;amp;;subject=SQL+2005%2f2008+OPEN+%7b+MASTER+%7c+SYMMETRIC+%7d+KEY+Password+Parameterization" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx&amp;amp;;title=SQL+2005%2f2008+OPEN+%7b+MASTER+%7c+SYMMETRIC+%7d+KEY+Password+Parameterization" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx&amp;amp;title=SQL+2005%2f2008+OPEN+%7b+MASTER+%7c+SYMMETRIC+%7d+KEY+Password+Parameterization" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx&amp;amp;;title=SQL+2005%2f2008+OPEN+%7b+MASTER+%7c+SYMMETRIC+%7d+KEY+Password+Parameterization" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx&amp;amp;;title=SQL+2005%2f2008+OPEN+%7b+MASTER+%7c+SYMMETRIC+%7d+KEY+Password+Parameterization&amp;amp;;top=1" target="_blank" title = "Post http://dotnet.org.za/markn/archive/2008/10/03/sql-2005-2008-open-master-symmetric-key-password-parameterization.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://dotnet.org.za/aggbug.aspx?PostID=699227" width="1" height="1"&gt;</description><category domain="http://dotnet.org.za/markn/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://dotnet.org.za/markn/archive/tags/security/default.aspx">security</category><category domain="http://dotnet.org.za/markn/archive/tags/encryption/default.aspx">encryption</category><category domain="http://dotnet.org.za/markn/archive/tags/password/default.aspx">password</category></item><item><title>Visual Studio 2008 Debugger: Exception Message Side-effect</title><link>http://dotnet.org.za/markn/archive/2008/08/30/visual-studio-debugger-exception-message-side-effect.aspx</link><pubDate>Sat, 30 Aug 2008 11:31:00 GMT</pubDate><guid isPermaLink="false">2d3a9e08-b70c-4031-ba2b-8f5282a2a59a:563926</guid><dc:creator>markn</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.org.za/markn/rsscomments.aspx?PostID=563926</wfw:commentRss><comments>http://dotnet.org.za/markn/archive/2008/08/30/visual-studio-debugger-exception-message-side-effect.aspx#comments</comments><description>&lt;p&gt;I was busy debugging an exception class that I am writing and could not for the life of me figure out why all the private fields were getting overwritten with incorrect values. I suspected the debugger had something to do with it, seeing as it runs fine in release mode. So I wrote a little test application, which proves that the debugger causes a side effect in Exeception classes.&lt;/p&gt;  &lt;p&gt;The debugger calls the Exception.Message property before the Exception class is fully constructed. Obviously, since Exception.Message is a virtual property, this results in a virtual call during construction and depending on the implementation of the overridden Message property, this can wreak havoc on the internal state of your class. I thought that perhaps the Debugger was calling ToString(), which was in turn calling Message. However, I overrode ToString and hard-coded the return. This proves that the debugger explicitly calls Exception.Message before construction of the Exception object instance is complete.&lt;/p&gt;  &lt;p&gt;Below is a sample application that demonstrates this debugger side-effect. If you run the application in Release mode, or in Debug mode without stepping into the code (F5), the expected output is displayed. However, if you step into the code (F11) the output is incorrect and the state of the class is permanently damaged. The StackTrace shows that the getter of the Message property (get_Message) is called from the constructor (.ctor), even though there is no code that does this.&lt;/p&gt;  &lt;p&gt;This is completely evil! I can only wonder what other methods and properties are explicitly and arbitrarily called during a debug session without you knowing it. There could be serious consequences/side-effects to arbitrarily calling methods and properties at the inappropriate times during the execution of an application. What is worse is there is no documentation that says that Exception.Message will be called by the debugger before construction of the Exception object instance is complete.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnet.org.za/blogs/markn/WindowsLiveWriter/VisualStudioDebuggerExceptionMessageSide_BEA1/image_6.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="125" alt="image" src="http://dotnet.org.za/blogs/markn/WindowsLiveWriter/VisualStudioDebuggerExceptionMessageSide_BEA1/image_thumb_2.png" width="244" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;font color="#00ff00"&gt;&lt;strong&gt;Error=1        &lt;br /&gt;Message=1&lt;/strong&gt;       &lt;br /&gt;&lt;/font&gt;Trace=&amp;#160;&amp;#160; at TestExceptionMessageDebugSideEffect.TestException&lt;font color="#00ff00"&gt;&lt;strong&gt;.get_Message()&lt;/strong&gt;&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160; at TestExceptionMessageDebugSideEffect&lt;font color="#00ff00"&gt;&lt;strong&gt;.Program.Main()&lt;/strong&gt;&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160; at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)     &lt;br /&gt;&amp;#160;&amp;#160; at System.AppDomain.Exe