zoukankan      html  css  js  c++  java
  • 安全的获取输入的密码基于非托管缓冲区

    /*--===------------------------------------------===---
    终于,Snippet Compiler开始支持UNICODE字符编码了。
    我亲爱的同学们,可以从下面的地址下载:
    http://www.sliver.com/dotnet/SnippetCompiler/
    这次我们演示这样一个demo:csc /unsafe register.cs
    编写提示用户输入密码的控制台程序,要求考虑安全性。
    --===------------------------------------------===---
    */

    namespace xumh
    {
        
    public class Register
        
    {
            
    public static void Main()
            
    {
                
    using(System.Security.SecureString ss = new System.Security.SecureString())
                
    {
                    System.Console.Write(
    "请输入密码:");
                    
    while(true)
                    
    {
                        System.ConsoleKeyInfo cki 
    = System.Console.ReadKey(true);
                        
    if(cki.Key == System.ConsoleKey.Enter)
                            
    break;
                        ss.AppendChar(cki.KeyChar);
                        System.Console.Write(
    "*");
                    }

                    System.Console.WriteLine();
                    
    //显示输入的密码
                    DisplaySecureString(ss);
                }
    //using后的SecureString会被销毁
                
            }

            
            
    //显示密码的方法
            private unsafe static void DisplaySecureString(System.Security.SecureString ss)
            
    {
                
    char* p = null;
                
    try
                
    {
                    
    //将 SecureString 揭秘到一个非托管内存缓冲区
                    p = (char*) System.Runtime.InteropServices.Marshal.SecureStringToCoTaskMemUnicode(ss);
                    
    for(int i=0;  p[i] !=0; i++)
                        System.Console.Write(p[i]);
                }

                
    finally
                
    {
                    
    if(p != null)//确保清楚并释放已解密SecureString字符的非托管内存缓冲区
                        System.Runtime.InteropServices.Marshal.ZeroFreeCoTaskMemUnicode((System.IntPtr) p);
                }

            }

        }

    }

  • 相关阅读:
    C# 窗体WinForm中动态显示radioButton实例
    C#和Java交互相关研究
    c# 注册表操作,创建,删除,修改,判断节点是否存在
    C#单例模式的三种写法
    C#中使用TCP通信
    c#中this的用法
    C#单例模式的三种写法
    二十道经典C#面试题
    Linux chattr 命令详解
    Linux ulimit命令详解
  • 原文地址:https://www.cnblogs.com/flaaash/p/1197324.html
Copyright © 2011-2022 走看看