2015-09-29 36 views
0

我能夠找到兩個Bcrypt庫,可以爲Windows編譯,但我很難在Delphi XE8中爲Android編譯它們。用於delphi XE8的多設備Bcrypt庫

第一個是https://github.com/chinshou/bcrypt-for-delphi,它不需要爲Windows編譯任何修改。

對於第二個https://github.com/PonyPC/BCrypt-for-delphi-lazarus-fpc我不得不做出的checkPassword功能一些小的調整,以獲得相同的結果,因爲它是FreePascal的具體:

function checkPassword(const Str: string; const Hash: ansistring): boolean; 
var 
    RegexObj: TRegEx; 
    match : TMatch; 
    Salt : String; 
begin 
    RegexObj := TRegEx.Create('^\$2a\$10\$([\./0-9A-Za-z]{22})',[roIgnoreCase]); 
    match := RegexObj.Match(Hash); 
    if match.Success then 
    begin 
    Salt := Copy(match.Value,8,22); 
    Result := HashPassword(Str, Salt) = Hash; 
    end 
    else 
    begin 
    Result := False; 
    end; 
end; 

從贏改變平臺Android上的第一個節目後很多錯誤,因爲它依賴於ComObj,Windows和ActiveX。將RegExpr替換爲RegularExpressions和Type後的第二個僅顯示changes in the String variable產生的衝突。代碼使用AnsiString,AnsiChar,我不能用String和Char替換它,因爲它會影響散列函數。

我錯過了什麼?我應該做些什麼其他修改來替換陳舊的AnsiString和AnsiChar聲明,從而允許爲Android編譯代碼?

+0

如果需要的ActiveX,它***不會***爲Android工作或任何其他平臺。 ActiveX僅限於Windows。與另一個相同,你不能指望用'String'來簡單地替換'AnsiChar',並期望它甚至可以在Windows中工作。你最好找到一個不同的庫,比如LockBox 10. –

+0

LockBox 10是多平臺的,支持Blowfish:https://github.com/TurboPack/LockBox –

+0

我提到的所有庫都只是windows而已只有ActiveX,但是代碼的某些部分可以用FMX函數替換,這是我試圖用第二個更兼容的庫實現的。我從來沒有希望這個代碼能夠通過簡單地替換字符串聲明來工作,你從哪裏得到這個想法?至於LockBox我會給它一個鏡頭,它看起來非常有前途。 – Roman

回答

2

的字符串聲明問題與第二庫是由移動命令在HashPassword功能

Move(password[1], key[0], Length(password)); 

由於從AnsiString類型爲字符串替換聲明之後改變了密碼變量的大小引起的。用一個簡單的for循環和Ord函數代替它可以解決這個問題,儘管可能有一個更優雅的方法。

function HashPassword(const Str: string; const salt: string): string; 
var 
    password: String ; 
    key, saltBytes, Hash: TBytes; 
    i: Integer; 
begin 
    password := AnsiToUtf8(str); 

    SetLength(key, Length(password) + 1); 
    for i := 0 to length(password)-1 do 
    key[i]:=ord(password[i+1]); 

    key[high(key)] := 0; 
    saltBytes := BsdBase64Decode(salt); 
    Hash := CryptRaw(key, saltBytes); 
    Result := FormatPasswordHashForBsd(saltBytes, Hash); 
end; 

總之,second library的到Android兼容的代碼轉換需要以下變化:

  • 修改正則表達式中的代碼checkPassword功能 根據張貼在問題的代碼

  • 通過將「RegExpr」替換爲「RegularExpressions,Types」來更改使用部分

  • 替換所有聲明從AnsiString類型爲字符串和ANSIChar類型爲CHAR

  • 修改HashPassword功能如上圖

+0

對我來說看起來並不合適。字符串是UTF-16編碼的。你想要一個字節數組。文本和二進制文件不是一回事。請問 –

+0

,你可以把你的編碼與所有的修改? – Yordankis