[VB.NET]SecureString較為安全的加密字串類別

[VB.NET]SecureString較為安全的加密字串類別

Namespace

System.Security

 

Framework

2.0 or Latter

 

SecureString

SecureString是.NET 2.0開始提供的加密字串類別,為一較安全的字串處理類別,適合用以保存較為機密或是較為敏感的字串。

SecureString內部使用DPAPI對記憶體作加密的動作,存入的資料會自動進行加密的動作,甚至可以使用MakeReadOnly方法讓物件執行個體設為唯讀狀態,避免被進一步修改。

在記憶體層級的保護上,對於該物件執行個體所使用的記憶體會被禁止作複製的動作(除非自行呼叫複製)。

SecureString提供較少的類別成員,像是檢查、比較或轉換等成員皆未提供,有助於防止執行個體值被不慎或惡意公開。此外,也有實作IDisposiable介面,可在不需使用資源時作即時的資源釋放,不像String一樣需等待GC的回收,減少機密資料存在記憶體中的時間,降低被竊取的風險。

 

重要成員

屬性

名稱 說明
Length 取得目前安全字串的長度。

 

方法

名稱 說明
AppendChar 將字元附加至目前安全字串的結尾。
Clear 刪除目前安全字串的值。
Copy 建立目前安全字串的複本
Dispose 釋放由目前的 SecureString 物件使用的所有資源。
InsertAt 將這個安全字串中的字元插入指定索引位置。
IsReadOnly 指示這個安全字串是否標示為唯讀。
MakeReadOnly 使這個安全字串的文字值成為唯讀。
RemoveAt 從這個安全字串移除位在指定索引位置的字元。
SetAt 使用另一個字元,取代位在指定索引位置的現有字元。

 

設定字串


        Dim secureString As New SecureString
        For Each c In testString
            secureString.AppendChar(c)           '使用AppendChar加入SecureString
        Next
        secureString.MakeReadOnly()              '設定為唯讀狀態

 

讀取字串


        Dim stringPointer As IntPtr = Marshal.SecureStringToBSTR(secureString)
        Try
            '配置 Managed String,並將儲存在 Unmanaged 記憶體的 BSTR 字串複製到其中,並顯示出來。
            Console.WriteLine(Marshal.PtrToStringBSTR(stringPointer))
        Finally
            '釋放之前使用 SecureStringToBSTR 方法配置的 BSTR 指標。
            Marshal.ZeroFreeBSTR(stringPointer)
        End Try

 

清除字串


        Dim secureString As New SecureString
        ...
        Console.WriteLine("原字串...")
        PrintSecureString(secureString)
        secureString.Clear()                     '使用Clear清除SecureString字串內容
        Console.WriteLine()
        Console.WriteLine("Clear呼叫後...")
        PrintSecureString(secureString)
    End Sub


    Public Sub PrintSecureString(ByVal secureString As SecureString)
    ...
    End Sub

 

完整範例

該範例主要是參閱How to: Use strings in a secure manner with SecureString classMaking Strings More Secure兩篇的範例所撰寫。


Imports System.Runtime.InteropServices

Module Module1

    Sub Main()
        Console.WriteLine("Please enter your password to be encrypted:")

        Dim password As SecureString = ReadPassword()

        Console.WriteLine()

        Console.WriteLine("Decripted password:")

        PrintPassword(password)
    End Sub


    Public Function ReadPassword() As SecureString

        Dim password As New SecureString()

        Dim nextKey As ConsoleKeyInfo = Console.ReadKey(True)

        While nextKey.Key <> ConsoleKey.Enter
            If nextKey.Key = ConsoleKey.Backspace Then
                If password.Length > 0 Then
                    password.RemoveAt(password.Length - 1)

                    ' erase the last * as well
                    Console.Write(nextKey.KeyChar)
                    Console.Write(" ")
                    Console.Write(nextKey.KeyChar)
                End If
            Else
                password.AppendChar(nextKey.KeyChar)
                Console.Write("*")
            End If

            nextKey = Console.ReadKey(True)
        End While

        password.MakeReadOnly()
        ' make the password read-only.

        ' return the encrypted password.

        Return password

    End Function

    Public Sub PrintPassword(ByVal password As SecureString)

        ' Uncrypt the password and get a reference to it...

        Dim bstr As IntPtr = Marshal.SecureStringToBSTR(password)


        Try
            ' Printing the uncrypted password...

            Console.WriteLine(Marshal.PtrToStringBSTR(bstr))

        Finally

            Marshal.ZeroFreeBSTR(bstr)

        End Try

    End Sub

End Module

 

image

 

Link