如何防止编辑框不被“星号查看器”看到密码?(300)

  • 主题发起人 主题发起人 bigface
  • 开始时间 开始时间
B

bigface

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟最近在开发一个大型项目,为了美化界面所以用了Raize控件,登录窗口的密码框用的是RzEdit控件,但是随便下载一个“星号查看器”就可以轻易看到密码,这让我很苦恼,因为项目涉及到资金进出,所以需要较高的安全性,请问有什么办法保护RzEdit不被看到密码?注:不要HOOK的方法。 因为本人不想要安装钩子。不想要任何的DLL。
 
断承加上重载。没有用过你所说的Raize控件,但我想它跟TEdit类是一样的吧,重载它的WM_GETTEXT消息即可。给个TEdit类的列子你参考一下。unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TEdit = class(StdCtrls.TEdit) public Display: Boolean; procedure WMGetText(var Message: TMessage); message WM_GETTEXT; end;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}{ TEdit }procedure TEdit.WMGetText(var Message: TMessage);begin if Display then inherited; Display := false;end;procedure TForm1.Button1Click(Sender: TObject);var GetText: array[0..255] of Char;begin {向我们的Edit发送消息看是否能取得Edit中的值} SendMessage(Edit1.Handle, WM_GETTEXT, 255, Integer(@GetText)); ShowMessage(string(GetText)); ShowMessage(Edit1.Text); //测试能否直接取得text值end;procedure TForm1.Button2Click(Sender: TObject);var GetText: array[0..255] of Char;begin { 由以上button2的过程测试,可以知道,现在我们自己也无法得到Text值了 为了处理上面的问题,所以我们给我们的Edit加入了一个新参数Display 下面的方法就可以取得Edit中的值了} Edit1.Display := True; SendMessage(Edit1.Handle, WM_GETTEXT, 255, Integer(@GetText)); //通过发送消息取值 ShowMessage(string(GetText)); Edit1.Display := True; ShowMessage(Edit1.Text); //测试能否直接取得text值end;end.需要注意的是,每次在要调edit的text值时,必须在前面加一句给Display属性赋值为true。不然就自己也得不到text的值了。
 
还要防止 EM_SETPASSWORDCHAR 消息,如果我用 SendMessage(Handle, EM_SETPASSWORDCHAR, Ord(#0), 0); 语句就可以让 Edit 的文本不再以 * 号显示。最好再拦截几个API函数,如 GetClassName 等。总之要多考虑一些才比较安全。
 
不要把真实密码赋给Edit,自己用变量保存用户输入的时候问题不大的,输入完之后你就用变量保存起来,然后Edit.Text := '*****';这样就看不到了。
 
自己写个完全自绘的edit[:D]
 
见下连接:http://www.delphibbs.com/keylife/iblog_show.asp?xid=34082你可以试试。
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=27840
 
楼上的这招无效,我用Findhandle程序试了一下,虽然类名已经找不到了,还是显示TForm1,但内容还是获取到了。
 
首先感谢szhcracker兄弟,但是我不想用DLL,因为我不想安装钩子,安装会导致360保险箱、卡巴之类的杀毒软件报“风险软件”。 所以我不想用哈,请问还有什么更好的办法没?
 
其实没让我搞懂的一点是:如果需要系统安全非常重要,那为什么会有可能在密码输入框中会让人用其它软件来查看星号?如果是正常登录,进去的登录界面就会没有了,该不会是在登录界面会默认输入密码?那不是就不安全了。
 
同意楼上的,你在登陆是密码记载你的脑子里,登录完了,这个页面也没有了,用什么星号查看器也没用,或许这么重要的系统你还允许登录界面保存密码或者自动登录?还是你输完密码时还允许别人用个查看器看看星号的内容?多次一举
 
不用钩子的方法要实现你的要求可能不太容易,或者是不够安全的。LS两位的说法都有问题,只要软件足够强劲,完全不需要由人操作就可以探测到密码框的内容,还有就是:千万不要以为登录界面没有了,你曾经输入过的密码就一定消失了,如果你的代码不够安全,它完全有可能还在内存中睡大觉呢。其实这个问题可以很复杂、很难(比如QQ的密码框,我是没有水平做出来的),也可以很简单、容易,关键就看LZ怎样平衡取舍了,我的建议是:差不多就行。
 
安全的做法就是edit的text 中存放伪密码,不要将真正的密码存放在这里。。
 
我个人认为,szhcracker说的就有些太深入了,其实安全是相当复杂的话题。我们的说法只是认为,在登录界面会自动保存密码是不太安全的做法,不应该保存,而是每次打开登录界面时,密码输入框是空的,需要手工输入,而不是显示几个星号,按一下“登录”按钮就直接进入了。
 
就算wm_Getext查不到,要得到值的办法还有千万种呢,别瞎费这个心思了。
 
说来说去,不又回到我最开始说的原点了不要给edit赋真实密码就是了。这个其实也只有在用户保存密码的时候,下次登录时显示界面会用到。如果说你的机器都中木马了,它拦截你的键盘输入就是了,除非你专门写个驱动程序。
 
你可以用一个函数取得键盘上用户的输入码再用一个加密后再给EDIT就可以了
 
前一阵做activex输入框控件时,实现了一个,应该用spy++, spy4win这样的东西看不得密码的,主要思路是接管wndproc消息中的WM_GETTEXT 和 EM_GETLINE。TNewEdit = class(TEdit) private FEnable: Boolean; protected procedure WndProc(var Msg: TMessage); override; procedure EditKeyPress(Sender: TObject; var Key: Char); procedure EditContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); public constructor Create(AOwner: TComponent); override; function GetInnerText: string; end;constructor TNewEdit.Create(AOwner: TComponent);begin inherited Create(AOwner); OnKeyPress := EditKeyPress; OnContextPopup := EditContextPopup; //禁止通过消息 FEnable := False;end;//用这个方法获取文本框值function TSafeEdit.GetInnerText: string;begin //程序本身还是用允许的 FEnable := True; Result := Trim(Text);end;//这个是关键procedure TSafeEdit.WndProc(var Msg: TMessage);begin if (Msg.Msg = WM_GETTEXT) or (Msg.Msg = EM_GETLINE) then begin if FEnable then begin FEnable := False; inherited; end; end else inherited;end;
 
用USBkey吧 这样就专人保管,然后再加密码
 
过滤WM_GETTEXT
 

Similar threads

后退
顶部