Re: Destroy a string



On Thu, 4 Jan 2007 01:43:31 +0100, "Willy Denoyette [MVP]"
<willy.denoyette@xxxxxxxxxx> wrote:

"rossum" <rossum48@xxxxxxxxxxxx> wrote in message
news:dhhop29evnktodbpniotoujsobi5ft7imh@xxxxxxxxxx
On Wed, 3 Jan 2007 16:13:58 -0600, "Ben Voigt" <rbv@xxxxxxxxxxxxx>
wrote:


"rossum" <rossum48@xxxxxxxxxxxx> wrote in message
news:c49op25un1a4lho1isikia8nvuueog06co@xxxxxxxxxx
On 3 Jan 2007 06:11:00 -0800, "Mark C" <MarkJohnCrosbie@xxxxxxxxx>
wrote:

I know a string is immutable, but is there any trick or any other way
to destroy a string

Thanks
www.quiznetonline.com
Not so much destroy the string as overwrite it:

/// <summary>
/// Overwrites a string in-situ. Useful for removing
/// evidence of keys, passwords etc.
/// </summary>
/// <param name="text">The string to overwrite.</param>
public static unsafe void OverwriteString(string text) {
const char overwriteChar = 'X';
fixed (char* cp = text) {
for (int i = 0; i < text.Length; ++i) {
cp[i] = overwriteChar;
} // end for
} // end fixed
} // end OverwriteString()

The string is still on the heap, but the sensitive information it
contained is no longer there.

The current location of the buffer is wiped, but if the string survived a
generation, the garbage collector has made copies :(

There may also be a copy on disk in swapspace, on automatic backups
and written on a post-it under the keyboard. It is not possible to be
completely secure, all that is possible is to make the attacker's job
more difficult.

rossum


That's why the SecureString was invented, it get's allocated in a non swappable fixed
portion of the process heap, it's contents get's encrypted and it' doesn't need the GC to
get wiped-out.

Willy.

The problems I have with SecureString are firstly that I cannot use it
directly, very few .NET methods accept SecureString as a parameter. I
have to take my sensitive data out of the secure string and transfer
it to something insecure, such as a string or a byte array, before I
can do anything useful with it. For example, none of the various
GetBytes() methods takes a SecureString as a parameter, I have to
write my own function to do this. I don't want to have to rewrite all
the .NET methods that can take a string as a parameter just so I can
have a SecureString as a parameter.

Secondly, I understand that SecureString is either uncertain, or not
present, in .NET 3, so I am reluctant to use something that I am just
going to have to rewrite when I come to upgrade.

SecureString is fine for storing something during the life of a
program, but it is not practical for anything other than pure storage.
In order to use it I have to put the secure data into other
non-encrypted containers. Hence the need to wipe those containers
when I am finished with them. I can wipe a byte array easily enough.
With a string I need to drop into unsafe code to do the wiping.

rossum

.



Relevant Pages

  • Re: Best practice SecureString and pswd collection
    ... because ConsoleKeyInfo just keeps one char in it's structure. ... There is never a string exposed. ... SecureString password = new SecureString; ...
    (microsoft.public.dotnet.security)
  • Re: System.Diagnostics.Process() hangs
    ... very simple and runs %system% ver, and returns the windows version. ... webservice will need to invoke an exe (which is a server application ... public string CreateTSUser ... SecureString securePass = new SecureString; ...
    (microsoft.public.dotnet.framework.aspnet)
  • Re: SecureString() in framework 1.1
    ... Note that the use of SecureString is not needed and that the same code would ... The SecureString allows to crpt/decrypt the string when needed and the ... Also as a side note it's likely best to always code for the framework you ... 1- how can use securestring whit fw 1.1? ...
    (microsoft.public.dotnet.languages.vb)
  • RE: System.Diagnostics.Process() hangs
    ... you redirected output & input, then did a wait for task exit. ... exit until it writes its output, which you won't read until it exits. ... public string CreateTSUser ... SecureString securePass = new SecureString; ...
    (microsoft.public.dotnet.framework.aspnet)
  • Re: Destroy a string
    ... public static unsafe void OverwriteString{ ... The string is still on the heap, ...
    (microsoft.public.dotnet.languages.csharp)