mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00
implementation of Unicode logic for password encryption
This commit is contained in:
@ -322,6 +322,9 @@ type
|
|||||||
function Explode(Separator, Text: String) :TStringList;
|
function Explode(Separator, Text: String) :TStringList;
|
||||||
procedure ExplodeQuotedList(Text: String; var List: TStringList);
|
procedure ExplodeQuotedList(Text: String; var List: TStringList);
|
||||||
function StrEllipsis(const S: String; MaxLen: Integer; FromLeft: Boolean=True): String;
|
function StrEllipsis(const S: String; MaxLen: Integer; FromLeft: Boolean=True): String;
|
||||||
|
function isUnicode(str: String): Boolean;
|
||||||
|
function encryptUnicode(str: String): String;
|
||||||
|
function decryptUnicode(str: String): String;
|
||||||
function encrypt(str: String): String;
|
function encrypt(str: String): String;
|
||||||
function decrypt(str: String): String;
|
function decrypt(str: String): String;
|
||||||
function HTMLSpecialChars(str: String): String;
|
function HTMLSpecialChars(str: String): String;
|
||||||
@ -524,15 +527,86 @@ begin
|
|||||||
Exit;
|
Exit;
|
||||||
if FromLeft then begin
|
if FromLeft then begin
|
||||||
SetLength(Result, MaxLen);
|
SetLength(Result, MaxLen);
|
||||||
Result[MaxLen] := '<EFBFBD>';
|
Result[MaxLen] := '
';
|
||||||
end else begin
|
end else begin
|
||||||
Result := Copy(Result, Length(Result)-MaxLen, Length(Result));
|
Result := Copy(Result, Length(Result)-MaxLen, Length(Result));
|
||||||
Result := '<EFBFBD>' + Result;
|
Result := '
' + Result;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{***
|
||||||
|
Check if string is Unicode
|
||||||
|
|
||||||
|
@param string String to check
|
||||||
|
@return boolean
|
||||||
|
}
|
||||||
|
function isUnicode(str: String): Boolean;
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
result := false;
|
||||||
|
for i := 1 to length(str) do begin
|
||||||
|
result := ord(str[i]) > 255;
|
||||||
|
if result then exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{***
|
||||||
|
Password-encryption, used to store session-passwords in registry
|
||||||
|
Unicode (UTF-16) version, support up to 0xFFFF
|
||||||
|
|
||||||
|
@param string Text to encrypt
|
||||||
|
@return string Encrypted Text
|
||||||
|
}
|
||||||
|
function encryptUnicode(str: String): String;
|
||||||
|
var
|
||||||
|
i, salt, nr: integer;
|
||||||
|
h: String;
|
||||||
|
begin
|
||||||
|
randomize();
|
||||||
|
result := '';
|
||||||
|
salt := random(9) + 1;
|
||||||
|
for i := 1 to length(str) do begin
|
||||||
|
nr := (ord(str[i]) + salt) mod 65536;
|
||||||
|
h := IntToHex(nr, 4); // 4 hex-symbols
|
||||||
|
result := result + h;
|
||||||
|
end;
|
||||||
|
// Adding Unicode flag
|
||||||
|
result := result + IntToStr(salt) + '0';
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{***
|
||||||
|
Password-decryption, used to restore session-passwords from registry
|
||||||
|
Unicode (UTF-16) version, support up to 0xFFFF
|
||||||
|
|
||||||
|
@param string Text to decrypt
|
||||||
|
@return string Decrypted Text
|
||||||
|
}
|
||||||
|
function decryptUnicode(str: String): String;
|
||||||
|
var
|
||||||
|
j, salt, nr: integer;
|
||||||
|
begin
|
||||||
|
result := '';
|
||||||
|
if str = '' then exit;
|
||||||
|
salt := StrToIntDef(str[length(str)], -1);
|
||||||
|
|
||||||
|
// Salt is NAN
|
||||||
|
if salt < 0 then exit;
|
||||||
|
|
||||||
|
j := 1;
|
||||||
|
while j < length(str) do begin
|
||||||
|
nr := StrToInt('$' + copy(str, j, 4)) - salt;
|
||||||
|
if nr < 0 then
|
||||||
|
nr := nr + 65536;
|
||||||
|
result := result + chr(nr);
|
||||||
|
inc(j, 4);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{***
|
{***
|
||||||
Password-encryption, used to store session-passwords in registry
|
Password-encryption, used to store session-passwords in registry
|
||||||
|
|
||||||
@ -544,6 +618,11 @@ var
|
|||||||
i, salt, nr : integer;
|
i, salt, nr : integer;
|
||||||
h : String;
|
h : String;
|
||||||
begin
|
begin
|
||||||
|
if isUnicode(str) then begin
|
||||||
|
result := encryptUnicode(str);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
randomize();
|
randomize();
|
||||||
result := '';
|
result := '';
|
||||||
salt := random(9) + 1;
|
salt := random(9) + 1;
|
||||||
@ -560,7 +639,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{***
|
{***
|
||||||
Password-decryption, used to restore session-passwords from registry
|
Password-decryption, used to restore session-passwords from registry
|
||||||
|
|
||||||
@ -573,9 +651,20 @@ var
|
|||||||
begin
|
begin
|
||||||
result := '';
|
result := '';
|
||||||
if str = '' then exit;
|
if str = '' then exit;
|
||||||
|
salt := StrToIntDef(str[length(str)], -1);
|
||||||
|
|
||||||
|
// Salt is NAN - error
|
||||||
|
if salt < 0 then exit;
|
||||||
|
|
||||||
|
// Salt is Unicode flag - Unicode logic
|
||||||
|
if salt = 0 then begin
|
||||||
|
// Removing Unicode flag
|
||||||
|
result := decryptUnicode(copy(str, 1, length(str) - 1));
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Salt is... salt - ANSI logic
|
||||||
j := 1;
|
j := 1;
|
||||||
salt := StrToIntDef(str[length(str)],0);
|
|
||||||
result := '';
|
|
||||||
while j < length(str)-1 do begin
|
while j < length(str)-1 do begin
|
||||||
nr := StrToInt('$' + str[j] + str[j+1]) - salt;
|
nr := StrToInt('$' + str[j] + str[j+1]) - salt;
|
||||||
if nr < 0 then
|
if nr < 0 then
|
||||||
@ -764,7 +853,7 @@ end;
|
|||||||
|
|
||||||
function RoundCommercial(e: Extended): Int64;
|
function RoundCommercial(e: Extended): Int64;
|
||||||
begin
|
begin
|
||||||
// "Kaufm<EFBFBD>nnisch runden"
|
// "Kaufmännisch runden"
|
||||||
// In contrast to Delphi's Round() which rounds *.5 to the next even number
|
// In contrast to Delphi's Round() which rounds *.5 to the next even number
|
||||||
Result := Trunc(e);
|
Result := Trunc(e);
|
||||||
if Frac(e) >= 0.5 then
|
if Frac(e) >= 0.5 then
|
||||||
|
Reference in New Issue
Block a user