
笔者最近的一个项目涉及到了支付动作,出于安全考虑,需要在密码控制上防键盘记录,传输加密等进行处理,其中难点在于防键盘记录。
现有的银行、支付宝、财付通、快钱等的支付控件都是自行开发,还需要对控件进行证书签名,这样相对成本较高。
笔者经过多方探讨研究,找到一个低成本的密码控件制作方法,那就是采用Silverlight为载体 ,不需要进行证书签名,好了,不扯废话了,上代码:
用VS2010新建一个Silverlight项目(我这里使用的是Silverlight5),将控件里的所有元素的宽和高都去掉,这样能够实现自适应大小,在HTML里控制密码框的大小。
xaml代码如下:
<UserControl x:Class="PaymentControl.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/Expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Loaded="UserControl_Loaded" SizeChanged="UserControl_SizeChanged"> <GrID x:name="LayoutRoot"> <TextBox HorizontalAlignment="left" margin="0,0" name="password" VerticalAlignment="Center" Text="" borderThickness="0" LostMouseCapture="password_LostMouseCapture" GotFocus="password_GotFocus" LostFocus="password_LostFocus" Background="White" /> </GrID></UserControl>关键代码:
1、模拟键盘:
[Dllimport("user32.dll")] static extern voID keybd_event(byte bVk,byte bScan,uint DWFlags,uint DWExtraInfo); [Dllimport("user32.dll")] static extern byte MapVirtualKey(byte wCode,int wMap);
2、我们在TextBox的方法里加上LostMouseCapture事件private voID password_LostMouseCapture(object sender,System.windows.input.MouseEventArgs e) { KeyDownControl(); Thread a = new Thread(SetEnable); a.IsBackground = true; a.Start(); } delegate voID setTextBoxReadonlyState(bool a); private voID setTextBoxReadonly(bool a) { setTextBoxReadonlyState myDelegate = new setTextBoxReadonlyState(SetTextBoxReadonlyMethod); this.dispatcher.BeginInvoke(myDelegate,a); } private voID SetTextBoxReadonlyMethod(bool a) { password.IsReadonly = a; } private voID SetEnable() { setTextBoxReadonly(false); } private voID KeyDownControl() { password.IsReadonly = true; int p = Next(5,15); for (int i = 4; i < p; i++) { byte RandKey = Next(32,126); keybd_event(RandKey,MapVirtualKey(RandKey,0),0);//按下 keybd_event(RandKey,0x2,0);//放开 Thread.Sleep(10); } } private byte Next(int min,int max) { Random ran = new Random(); byte RandKey = (byte)ran.Next(min,max); return RandKey; }
3、LostMouseCapture事件是整个处理的核心,由其触发密码文本混淆策略。密码混淆策略的核心就是在textBox获得焦点的时候模拟键盘输入一堆随机文本,这样做即使截获了密码文本,也是无用的。
上截图,测试时我输入的内容是asdf
代码基本上完了,请各位看客拍砖的时候轻点!
以上是内存溢出为你收集整理的用Silverlight打造一个相对安全的密码控件全部内容,希望文章能够帮你解决用Silverlight打造一个相对安全的密码控件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)