主题:编写的数据库程序如何实现软加密?
fhquumtd
[专家分:0] 发布于 2007-05-11 15:20:00
本人在写一个数据库程序,因为该程序是针对行业的程序,这样程序写完后就可以把它卖到这个行业里,但是自己也不会写加密程序,不知道如何才能将程序进行软加密呢?
比如说一个序列号只能应用一台机器,既使别的机器使用该序列号的软件也不好使呢!
回复列表 (共3个回复)
沙发
长尾兔 [专家分:3630] 发布于 2007-05-11 15:26:00
工程文件:
begin
获得本机硬盘序列号、网卡序列号、主板序号...;
对上述信息进行只有你自己知道的运算处理,形成一个字符串TrueKey;
查找注册表里或程序路径下有没有相应的Key标记;
如果没有,则弹出一个要求输入注册码的窗口
如果不输入注册码,或注册码不等于TrueKey,则退出程序;
如果输入的注册码正确,则把该码写到注册表里或程序路径下;
正常启动程序
end;
板凳
长尾兔 [专家分:3630] 发布于 2007-05-11 15:28:00
另外,程序中需要有提交本机硬盘序列号、网卡序列号、主板序号...等信息的部分,注意不是提交TrueKey。可以用网上注册的方式。你知道他的这些信息后,就经你运算,算出TrueKey,然后告诉你的用户。
3 楼
长尾兔 [专家分:3630] 发布于 2007-05-14 16:41:00
收到你的站内短消息。即兴给你写了一个Demo,希望对你有帮助。
因我未在应用项目中使用这种注册方案,所以不知其实用性如何。如果你使用这种方案,希望你能通过站内短信向我反馈应用效果。
这个方案的关键之处,就在于对用户机器及操作系统信息的加密处理的程度。你可以看到,注册码直接放到了程序目录下,但其他用户即使复制这个注册码,也是无用的。
Demo中部分代码需要你从网上下载成熟源码参考。因是演示,所以,假设的用户电脑信息字符串为'abcd',加密后的注册码为'bacd'。你只需在注册窗口中提交注册码bacd即可打开程序主窗口。注册码被保存在程序目录下的key.txt。
//-----以下是工程文件----------
program Prj_RegDemo;
uses
Forms, Windows, SysUtils,
Unt_MainForm in 'Unt_MainForm.pas' {MainForm},
Unt_RegForm in 'Unt_RegForm.pas' {RegForm};
{$R *.res}
var
Key, TrueKey, RegisterKey : string;
F : TextFile;
Registed : Boolean;
begin
Application.Initialize;
Registed := False; //初始值本就是False。
Key := GetUserInfo;
TrueKey := GetTrueKey(Key);
if FileExists(SysUtils.ExtractFilePath(Application.ExeName)+'Key.txt') then
begin
AssignFile(F, SysUtils.ExtractFilePath(Application.ExeName)+'Key.Txt');
Reset(F);
ReadLn(F, RegisterKey);
CloseFile(F);
//只有程序目录下有正确的注册码,Registed才为True
if RegisterKey = TrueKey then Registed := True;
end;
if Not Registed then //如果用户未注册或注册码不正确,则出现注册窗口
begin
RegForm := TRegForm.Create(nil);
try
RegForm.ShowModal;
finally
RegForm.Free;
end;
Application.Terminate; //注册窗口关闭后,程序退出
end else begin //如果用户已正确注册,则直接打开主窗口
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end;
end.
//--------以下是RegForm的单元文件--------
unit Unt_RegForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
function GetUserInfo: string;
function GetTrueKey(Key : string): string;
type
TRegForm = class(TForm)
Edit_PleaseEnterUserMailAddr: TEdit;
Edit_PleaseEnterYourSN: TEdit;
Btn_Register: TButton;
Btn_SendMail: TButton;
Label1: TLabel;
procedure Btn_SendMailClick(Sender: TObject);
procedure Btn_RegisterClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
RegForm: TRegForm;
implementation
{$R *.dfm}
function GetUserInfo: string;
begin
//获得用户机器的一些硬件信息和操作系统信息。网上有成熟代码。
//此处用一个字符串'abcd'假设就是获得的上述信息
Result := 'abcd';
end;
function GetTrueKey(Key : string): string;
var
TempStr : string;
begin
//你可以自己写一个对字符串进行加密处理的算法。
//也可以参考Base64编码等算法
//在此简单地把前二个字符互换,假设就是进行了加密处理
TempStr := Key;
TempStr[1] := Key[2];
TempStr[2] := Key[1];
Result := TempStr;
end;
procedure TRegForm.Btn_SendMailClick(Sender: TObject);
begin
//把GetUserInfo获得的用户信息以及用户的邮址,通过电子邮件发到你的邮箱
//如何发邮件?网上有成熟代码。
ShowMessage('谢谢您申请注册!三日后请查询'+Edit_PleaseEnterUserMailAddr.Text+
'邮箱,将会收到我们给您的注册码!');
self.ModalResult := 1;
end;
procedure TRegForm.Btn_RegisterClick(Sender: TObject);
var
F : TextFile;
begin
AssignFile(F, SysUtils.ExtractFilePath(Application.ExeName)+'Key.txt');
ReWrite(F);
WriteLn(F, Edit_PleaseEnterYourSN.Text);
CloseFile(F);
ShowMessage('谢谢您提交SN!程序将关闭,请重新运行。');
self.ModalResult := 1;
end;
procedure TRegForm.FormCreate(Sender: TObject);
begin
Label1.WordWrap := True;
Label1.Caption := '本软件注册后方可使用。如果您已经得到注册码,'+
'请在Edit_PleaseEnterYourSN框中输入您的注册码,'+
'然后点击Btn_Register按钮;'+
'如果您想现在申请注册码,请在Edit_PleaseEnterUserMailAddr'+
'框中输入您的常用邮箱,然后点击Btn_SendMail按钮。';
end;
end.
//----------以下是程序主窗口的单元文件(无内容)------
unit Unt_MainForm;
//这就是你自己的事情了。
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMainForm = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
end.
我来回复