如何把密碼隱藏(200分)

  • 主题发起人 主题发起人 W1979
  • 开始时间 开始时间
W

W1979

Unregistered / Unconfirmed
GUEST, unregistred user!
我們用TDatabase時﹐里面要寫帳號和密碼﹐所以我想把它們放到一個DLL中﹐
Export出兩個函數比如GetUser,GetPassword,但是這也有問題﹐別人拿到這
個DLL只要一show就看的到用戶和密碼,加密的方法不行﹐因為我防的是自己
人.所以我寫了一個控件﹕
unit tech;

interface

uses
Windows, SysUtils, Graphics, Classes, Controls, Db, DBCommon,
Bde, SMIntf,DBTables;

type
TDatabase1 = class(TDatabase)
private
FInternalParams: TStrings;
protected
procedure DoConnect; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

procedure Register;

implementation

constructor TDatabase1.Create(AOwner: TComponent);
begin
inherited;
FInternalParams := TStringList.Create;
FInternalParams.Add('SERVER NAME=pbcost');
FInternalParams.Add('USER NAME=tech');
FInternalParams.Add('NET PROTOCOL=TNS');
FInternalParams.Add('OPEN MODE=READ/WRITE');
FInternalParams.Add('SCHEMA CACHE SIZE=8');
FInternalParams.Add('LANGDRIVER=');
FInternalParams.Add('SQLQRYMODE=');
FInternalParams.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
FInternalParams.Add('SCHEMA CACHE TIME=-1');
FInternalParams.Add('MAX ROWS=-1');
FInternalParams.Add('BATCH COUNT=200');
FInternalParams.Add('ENABLE SCHEMA CACHE=FALSE');
FInternalParams.Add('SCHEMA CACHE DIR=');
FInternalParams.Add('ENABLE BCD=FALSE');
FInternalParams.Add('ENABLE INTEGERS=FALSE');
FInternalParams.Add('LIST SYNONYMS=NONE');
FInternalParams.Add('ROWSET SIZE=20');
FInternalParams.Add('BLOBS TO CACHE=64');
FInternalParams.Add('BLOB SIZE=32');
FInternalParams.Add('OBJECT MODE=TRUE');
FInternalParams.Add('PASSWORD=y2tech');
end;

destructor TDatabase1.Destroy;
begin
FInternalParams.Free;
inherited;
end;

procedure TDatabase1.DoConnect;////////////////////////////////HERE[?]
begin
if not(csDesigning in ComponentState)then
begin
try
Params.Assign(FInternalParams);
inherited;
finally
// Params.clear;//[?] 這樣出錯
end;
end
end;
procedure Register;
begin
RegisterComponents('Samples', [TDatabase1]);
end;

end.

原來是想DoConnect后立即把參數清掉﹐不料這樣會出錯﹐只好判斷是否在
運行狀態﹐運行時才給參數賦值﹐這樣也有問題﹐因為運行時人家只要一show
就知道我的密碼,請問怎么辦呢

 
几点意见:
1、老兄为何直接把所有的东西都直接放在DataBase的Create中呢?
没必要吧,可以把它放在一个私有过程中,再重载BeforeConnect,把PassWord加上!
2、以元件的形式提供不太好,不如直接提供一个DLL,只输出一个Execute过程,
这个过程只是将DataBase连接好!(DataBase做为私有数据,不可见!)
3、如果非要提供元件的话,元件不要直接从DataBase继承,从TComponent继承就好了
把DataBase设为私有数据,DataBase相关的属性以新元件的属性的方式来提供!

以上三种方法,方法一不太安全,方法三比较麻烦,还是方法二比较好一些!
BTW:密码值应该加密,要不然辛辛苦苦做的工作一点用没有!
 
请你明白安全的意义:

密码仅是一种手段,任何手段都会有其弱点。你已经把密码给了数据库连接了,说明别人
对你的密码及密码机制非常清楚,隐藏有何用?何别?

--------------

如果你非要这么做,请 你:
1、设置LoginPrompt = true
2. 写OnLogin 事件,提供UserName 和 Password

这样你的数据库密码参数就不会泄露了。特别是来自于用户输入的情况。

 
你的所有的“SHOW”的问题,都是在于你把DataBase直接提供了,
只要把DataBase封装起来,就没有问题了!
 
TO LLLYJ:
我說過﹐我是防自己人﹐我把密碼封裝起來﹐我們自己的程序員有系統的代碼也沒用

>>以元件的形式提供不太好,不如直接提供一个DLL,只输出一个Execute过程

是不是說只傳一個TDataBase類型的參數進去?
 
为什么是传一个TDataBase的参数进去?
可以什么都不要啊(或者只传一个新别名的String如:AAA)!
只要在这个输出过程中把DataBase(当然是内部的了!)连上就可以了!
这样它就会动态生成一个别名,就是AAA了,然后你的程序只要直接使用
这个AAA别名不就行了?

 
你上面的代码当然会出错了,因为TDatabase打开时是不允许你清空Params的。
不明白你为什么要对程序员隐藏这些东西,如果这点信任都没有的话,那就别做了(要是我的话)
因为等你程序真正稳定运行之后,这些数据连接信息肯定是不同的!所以我觉得没必要做
这个无用功。
 
你的意思是把TDatabase放在DLL中?這樣可以么?
肯定不行
 
Faint!服务器怎么回事???又报找不到服务器,害得我半天白打了!!!

老兄,我想上面已经说得够明白了!

新建一个DLL,申明好输出函数如:InitDataBase(AName:String);
在它的implementation段后加上一个DataBase如:DBS:TDataBase
在procedure InitDataBase实现部份创建DataBase,并设好连接参数,连接!

编译DLL,写好DLL的接口单元。

在你的程序中,把所有对数据访问控件的AliasName都设为AName的值,
在Application的初始后,建DataModule之前调用这个过程!这样就可以了!


又想了一下,这种方法在设计期不好用,可能报找不到别名什么的!
这样写就主要是方便连接不同的数据库,如果在设计期使用,还是得用自制
控件来得方便一些。(当然控件也可以用DLL的)

用自制控件的方法见方法三。
 
多人接受答案了。
 
后退
顶部