好了,所以我寫的。
用法:
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編碼
所以這就是爲什麼HashPassword
和CheckPassword
功能需要WideString
(又名UnicodeString
),並在內部將它們轉換爲UTF-8。如果你在一個版本的Delphi,其中UnicodeString
是一個保留字運行這一點,那麼簡單地定義出來:
type
UnicodeString = WideString;
我,大衛·赫弗南知道,不要自己德爾福XE 2.我添加了UnicodeString
別名,但不包括compilers.inc
並定義爲UnicodeString
(因爲我不知道定義名稱,我也不能測試它)。你想從免費代碼中得到什麼?
的代碼包括兩個單元:
哪裏可以在intertubes上放一些代碼,它可以永久生活嗎?
更新1/1/2015:它被放在GitHub前一段時間:BCrypt for Delphi。
獎勵2015年4月16日:現在有Scrypt for Delphi
你準備好考慮Vista中引入的Windows bcrypt嗎? JEDI有一個頭文件翻譯:JwaBCrypt.pas – 2012-03-14 22:11:45
@David:這似乎是我在問題中提到的bcrypt.h winapi頭文件的另一個翻譯版,它實際上並未包含Blowfish密碼哈希實現。 (或者我錯過了什麼?) – 2012-03-14 22:21:51
魯迪的頭是JEDI的起源之一,http://blog.delphi-jedi.net/2008/03/10/new-and-additional-header-files-from-rudy/ – 2012-03-14 22:33:00