Skip to content

Commit 463ba5b

Browse files
committed
Secure string usage covered with SecureString class and getted values by using 3 different ways
1 parent c4bcc7a commit 463ba5b

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net8.0</TargetFramework>
6+
<RootNamespace>_23_SecureString_Memory_Security</RootNamespace>
7+
<ImplicitUsings>enable</ImplicitUsings>
8+
<Nullable>enable</Nullable>
9+
</PropertyGroup>
10+
11+
</Project>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Runtime.InteropServices;
2+
using System.Security;
3+
4+
Console.WriteLine();
5+
6+
#region Usage of SecureString
7+
8+
string bankCardNumber = "1234 5678 9012 3456";
9+
SecureString secureBankCardNumber = new();
10+
11+
foreach (char c in bankCardNumber)
12+
secureBankCardNumber.AppendChar(c);
13+
14+
secureBankCardNumber.MakeReadOnly();
15+
16+
//secureBankCardNumber.AppendChar('7'); // Throws InvalidOperationException because it is read-only after line 13
17+
#endregion
18+
19+
#region Getting the value of SecureString
20+
21+
//First way
22+
IntPtr bstr = Marshal.SecureStringToBSTR(secureBankCardNumber);
23+
var value = Marshal.PtrToStringUni(bstr);
24+
Console.WriteLine(value);
25+
26+
//Second way
27+
IntPtr bstr2 = Marshal.SecureStringToBSTR(secureBankCardNumber);
28+
var value2 = Marshal.PtrToStringAuto(bstr2);
29+
Console.WriteLine(value2);
30+
31+
//Third way
32+
IntPtr bstr3 = Marshal.SecureStringToBSTR(secureBankCardNumber);
33+
char[] chars = new char[secureBankCardNumber.Length];
34+
Marshal.Copy(bstr3, chars, 0, secureBankCardNumber.Length);
35+
string value3 = string.Join("", chars);
36+
Marshal.ZeroFreeBSTR(bstr3);
37+
Console.WriteLine(value3);
38+
#endregion

Advanced-C#-Programming/Advanced-C#-Programming.sln

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "20_Reflection", "20_Reflect
4343
EndProject
4444
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "21_IObservable-IObserver", "21_IObservable-IObserver\21_IObservable-IObserver.csproj", "{B287980D-96C5-47DB-B46B-0A34ACB9C9E7}"
4545
EndProject
46-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "22_Random-Number-Generation", "22_Random-Number-Generation\22_Random-Number-Generation.csproj", "{1ECE838F-9763-43FF-9A5C-6CD38DE3D08B}"
46+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "22_Random-Number-Generation", "22_Random-Number-Generation\22_Random-Number-Generation.csproj", "{1ECE838F-9763-43FF-9A5C-6CD38DE3D08B}"
47+
EndProject
48+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "23_SecureString-Memory-Security", "23_SecureString-Memory-Security\23_SecureString-Memory-Security.csproj", "{4D10EB63-A912-4DC8-B0FD-EFE48F988554}"
4749
EndProject
4850
Global
4951
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -135,6 +137,10 @@ Global
135137
{1ECE838F-9763-43FF-9A5C-6CD38DE3D08B}.Debug|Any CPU.Build.0 = Debug|Any CPU
136138
{1ECE838F-9763-43FF-9A5C-6CD38DE3D08B}.Release|Any CPU.ActiveCfg = Release|Any CPU
137139
{1ECE838F-9763-43FF-9A5C-6CD38DE3D08B}.Release|Any CPU.Build.0 = Release|Any CPU
140+
{4D10EB63-A912-4DC8-B0FD-EFE48F988554}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
141+
{4D10EB63-A912-4DC8-B0FD-EFE48F988554}.Debug|Any CPU.Build.0 = Debug|Any CPU
142+
{4D10EB63-A912-4DC8-B0FD-EFE48F988554}.Release|Any CPU.ActiveCfg = Release|Any CPU
143+
{4D10EB63-A912-4DC8-B0FD-EFE48F988554}.Release|Any CPU.Build.0 = Release|Any CPU
138144
EndGlobalSection
139145
GlobalSection(SolutionProperties) = preSolution
140146
HideSolutionNode = FALSE

0 commit comments

Comments
 (0)