2012-03-14 66 views
14

我試圖找到一個我可以在Delphi中使用的bcrypt實現。關於谷歌帶給我的唯一有用的東西是this download page,其中包含一個名爲bcrypt.h的winapi單位的翻譯標題。但是當我看到它提供的功能時,bcrypt.h似乎並不包含任何使用Blowfish算法來散列密碼的方法!是否有可用於Delphi的bcrypt實現?

我發現了一些C的bcrypt實現,我可以建立一個DLL並鏈接到它們,除非它們似乎都需要* nix或者是GCC特定的,所以這也不起作用!

這是八九不離十推動我逼瘋了。我認爲可以很容易找到一個實現,但似乎並不是這種情況。有誰知道我可以在哪裏得到一個?

+2

你準備好考慮Vista中引入的Windows bcrypt嗎? JEDI有一個頭文件翻譯:JwaBCrypt.pas – 2012-03-14 22:11:45

+0

@David:這似乎是我在問題中提到的bcrypt.h winapi頭文件的另一個翻譯版,它實際上並未包含Blowfish密碼哈希實現。 (或者我錯過了什麼?) – 2012-03-14 22:21:51

+0

魯迪的頭是JEDI的起源之一,http://blog.delphi-jedi.net/2008/03/10/new-and-additional-header-files-from-rudy/ – 2012-03-14 22:33:00

回答

18

好了,所以我寫的。

用法:

hash: string; 
hash := TBCrypt.HashPassword('mypassword01'); 

回報是這樣的:

$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm 

這個(OpenBSD的)風格的密碼哈希的有用的東西是:

  • ,它識別算法(2a = bcrypt)
  • the sal t會自動爲您創建,並隨附散列(Ro0CUfOqk6cXEKf3dyaM7O
  • 成本因子參數也隨散列(10)一起攜帶。

要檢查密碼是否正確:

isValidPassword: Boolean; 
isValidPassword := TBCrypt.CheckPassword('mypassword1', hash); 

BCrypt使用成本因素,它決定多少次迭代的關鍵設置雖然會去。成本越高,計算哈希值就越昂貴。恆定BCRYPT_COST包含默認成本:

const 
    BCRYPT_COST = 10; //cost determintes the number of rounds. 10 = 2^10 rounds (1024) 

在這種情況下10成本意味着鍵將被擴展和鹽醃2 10 = 1024回合。這是此時常用的成本因素(早期21 st世紀)。

這也是有趣的是,因爲沒有已知的原因,OpenBSD的哈希密碼轉換成Base64的變種,是由其他人在這個星球上使用的Base64編碼的不同。所以TBCrypt包含一個自定義的base-64編碼器和解碼器。

這也是有用的注意,哈希算法版本2a用來表示:

  • bcrypt
  • 包含密碼的空終止的散列數據
  • unicode字符串是UTF-8編碼

所以這就是爲什麼HashPasswordCheckPassword功能需要WideString(又名UnicodeString),並在內部將它們轉換爲UTF-8。如果你在一個版本的Delphi,其中UnicodeString是一個保留字運行這一點,那麼簡單地定義出來:

type 
    UnicodeString = WideString; 

我,大衛·赫弗南知道,不要自己德爾福XE 2.我添加了UnicodeString別名,但不包括compilers.inc並定義爲UnicodeString(因爲我不知道定義名稱,我也不能測試它)。你想從免費代碼中得到什麼?

的代碼包括兩個單元:

  • Bcrypt.pas(我寫的,具有嵌入的DUNIT測試)
  • Blowfish.pas(其戴夫巴頓寫,這是我適於在延伸,固定一些錯誤並加入DUNIT測試)。

哪裏可以在intertubes上放一些代碼,它可以永久生活嗎?

更新1/1/2015:它被放在GitHub前一段時間:BCrypt for Delphi

獎勵2015年4月16日:現在有Scrypt for Delphi

+2

Perpetuity?真的沒有。但SourceForge,谷歌代碼,GitHub或BitBucket是很好的候選人,應該在很長的一段時間。 – afrazier 2012-05-04 04:16:10

+0

現在將答案中的文件名('bcrypt.pas','blowfish.pas')鏈接到pastebin。 – 2012-05-04 13:26:48

+0

真的應該把這個放在Bitbucket上! – 2012-09-27 03:01:35

相關問題