dipende se la tua applicazione si appoggia ad un database oppure no
nel caso dipenda da un database server (che sia locale o in rete), le chiavi "hostname"/"database name" ti mettono al riparo dal copiarlo altrove senza il tuo intervento. La Ragione sociale è quella che poi visualizzi sulla licenza e metti in automatico sulle stampe.
Per quanto riguarda il nr. di pc sul quale si possono usare basta che invece controlli le connessioni attive: possono anche copiarlo su 100 pc in rete ma se gli utenti concorrenti sono stati raggiunti... il client non entra.
per quanto riguarda l'implementazione non è che ci sia tanto da dire, bastano 2 funzioni:
- calcolo md5
- cifratura/decifratura
per il calcolo md5, in delphi, ho risolto così:
function md5(const Input: String): String;
var
hCryptProvider: HCRYPTPROV;
hHash: HCRYPTHASH;
bHash: array[0..$7f] of Byte;
dwHashLen: longword; // DWORD;
pbContent: PByte;
i: Integer;
begin
dwHashLen := 16;
pbContent := Pointer(PChar(Input));
Result := '';
if CryptAcquireContext(@hCryptProvider, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET) then
begin
if CryptCreateHash(hCryptProvider, CALG_MD5, 0, 0, @hHash) then
begin
if CryptHashData(hHash, pbContent, Length(Input), 0) then
begin
if CryptGetHashParam(hHash, HP_HASHVAL, @bHash[0], @dwHashLen, 0) then
begin
for i := 0 to dwHashLen - 1 do
begin
Result := Result + Format('%.2x', [bHash[i]]);
end;
end;
end;
CryptDestroyHash(hHash);
end;
CryptReleaseContext(hCryptProvider, 0);
end;
Result := AnsiLowerCase(Result);
end;
per la cifratura scegli una qualsiasi libreria, va bene anche un XOR alla fine :)