我需要驗證使用python passlib生成的密碼哈希。我的目標是使用passlib的pbkdf2_sha512
方案來散列所有用戶密碼。但是,由於我們後端的特性,我需要從php腳本,js和java驗證此密碼。我沒有發現任何一個庫都可以使用passlib散列並驗證密碼。我想知道在我開始在php,js和java中實現passlib的哈希算法之前是否存在一個。驗證由python passlib生成的密碼哈希
回答
在java中,您可以使用jython,它允許使用python庫並執行python代碼。
下面是示例Java函數使用passlib驗證哈希:
Boolean verify_pbkdf2_sha512(String pw, String hash) {
PythonInterpreter python = new PythonInterpreter();
python.exec("from passlib.hash import pbkdf2_sha512");
python.set("pw", new PyString(pw));
python.set("hash", new PyString(hash));
python.exec("valid = 1 if pbkdf2_sha512.identify(hash) and pbkdf2_sha512.verify(pw, hash) else 0");
Boolean valid = ((PyInteger)python.get("valid")).asInt()==1;
return (Boolean)valid;
}
你可以找到我的博客的更多信息:http://codeinpython.blogspot.com/2015/11/using-python-passlib-in-java.html
Passlib的pbkdf2_sha256哈希格式習俗passlib,所以有(可能? )不會有太多的端口可用於其他語言。但它是一個非常簡單的PBKDF2-HMAC-SHA256算法+ base64編碼封裝,其中均爲標準,並且應該具有其他語言的實現 - 所以它應該很容易移植。
但是,如果可移植性是優先級要求,則可能需要嘗試使用passlib的bcrypt或sha256_crypt散列值。這兩個都是標準的,並且應該有多種語言的實現。
請記住,bcrypt & sha256_crypt非常複雜 - 所以如果你無法根據你需要的語言找到一個端口,那麼移植pbkdf2_sha256將比移植其中一個語言少很多。
另一個選擇完全是通過子進程在python下調用passlib。 調用下面的Python oneliner ...
python3 -c 'import sys; from passlib.hash import pbkdf2_sha256 as ph; print(ph.verify(input(), input()))'
......將讓你寫password\nhash\n
到標準輸入,並把它寫回True
或False
(或者如果哈希的格式不正確的錯誤消息)。
由於密碼是通過標準輸入寫入的,因此這應該是相對安全的(與將它作爲參數或env var傳遞相比)。
(該python2相當於是一樣的,只是使用raw_input()
代替input()
)
我可以爲PHP這種解決方案:
/*
* This function creates a passlib-compatible pbkdf2 hash result. Parameters are:
* $algo - one of the algorithms supported by the php `hash_pbkdf2()` function
* $password - the password to hash, `hash_pbkdf2()` format
* $salt - a random string in ascii format
* $iterations - the number of iterations to use
*/
function create_passlib_pbkdf2($algo, $password, $salt, $iterations)
{
$hash = hash_pbkdf2($algo, $password, base64_decode(str_replace(".", "+", $salt)), $iterations, 64, true);
return sprintf("\$pbkdf2-%s\$%d\$%s\$%s", $algo, $iterations, $salt, str_replace("+", ".", rtrim(base64_encode($hash), '=')));
}
我複製的鹽,迭代和算法出來的一個現有的passlib生成的哈希字符串,併爲它們提供明文密碼給該函數,它將生成與passlib相同的結果。
這裏是一個PHP函數只是驗證passlib PBKDF2密碼,基於以上:
/*
* This function verifies a python passlib-format pbkdf2 hash against a password, returning true if they match
* only ascii format password are supported.
*/
function verify_passlib_pbkdf2($password, $passlib_hash)
{
if (empty($password) || empty($passlib_hash)) return false;
$parts = explode('$', $passlib_hash);
if (!array_key_exists(4, $parts)) return false;
/*
* Results in:
* Array
* (
* [0] =>
* [1] => pbkdf2-sha512
* [2] => 20000
* [3] => AGzdiek7yUzJ9iorZD6dBPdy
* [4] => 0298be2be9f2a84d2fcc56d8c88419f0819c3501e5434175cad3d8c44087866e7a42a3bd170a035108e18b1e296bb44f0a188f7862b3c005c5971b7b49df22ce
*)
*/
$t = explode('-', $parts[1]);
if (!array_key_exists(1, $t)) return false;
$algo = $t[1];
$iterations = (int) $parts[2];
$salt = $parts[3];
$orghash = $parts[4];
$hash = create_passlib_pbkdf2($algo, $password, $salt, $iterations);
return $passlib_hash === $hash;
}
- 1. 如何驗證由Python的Passlib使用Node.js創建的加密哈希?
- 2. 在Node.js中生成和驗證密碼哈希與Python的werkzeug相同
- 3. 在ruby中驗證OpenCart密碼哈希
- 4. 快速驗證md5哈希密碼
- 5. 如何驗證哈希密碼PHP類
- 6. 驗證一個哈希密碼
- 7. 無法驗證哈希密碼
- 8. UserCreationForm,哈希密碼和驗證()
- 9. 如何驗證哈希密碼
- 10. 如何驗證密碼哈希
- 11. 與哈希ASP.NET MVC密碼驗證
- 12. 如何驗證哈希密碼?
- 13. CakePHP - 驗證哈希密碼不同於安全::哈希()
- 14. 生成NTLMv2哈希和驗證
- 15. 是否可以驗證密碼哈希與另一個密碼哈希?
- 16. Rfc2898DeriveBytes與Sha2哈希密碼生成
- 17. 驗證python-pbkdf2中的PBKDF2密碼哈希
- 18. 未生成密鑰哈希
- 19. 哈希表密鑰生成
- 20. python passlib驗證不匹配
- 21. CakePHP哈希密碼
- 22. 通過MySQL生成密碼的pbkdf2_sha256哈希
- 23. 哈希驗證
- 24. MySQL中的密碼和哈希密碼
- 25. 哈希密碼
- 26. 哈希的tomcat密碼
- 27. ActiveDirectoryMembershipProvider.ValidateUser與哈希密碼
- 28. Laravel&Meteor密碼哈希
- 29. 密碼認證 - 不一致的哈希
- 30. PHP密碼哈希()