我有一个存储用户登录信息的表,其中包含以下方案中的密码
是否有一个了解此方案的perl模块,并且能够在给定明文密码的情况下验证密码?
就像是
打印"success !! \n"如果validatePassword("helloworld",{CRYPT} r2sKInajXZ6Fk)
谢谢.
根据PHP的文档,bcrypt salt是由
"$ 2a $",两位数的成本参数"$",以及字母"./0-9A-Za-z"中的22位数字
因此,如果我使用crypt()函数来哈希我的密码,结果输出包括前七个字符($ 2a $ 10 $,如果10是成本参数)作为盐的一部分 - 并且,根据所有示例我能够在互联网上找到这个完整的输出写入db.
我想知道将剩下的盐和加密数据存储在第一个字符的重点是什么.他们的意思对我来说是完全清楚的,但是我无法理解为什么这些信息应该与哈希的其余部分一起编写.它们不是关于算法的"正义"信息和计算的自适应成本吗?那么存储此类与应用程序相关的信息有什么好处?并且(即使可能听起来很幼稚)为什么要将它们泄露给最终可以抓住我的数据库的攻击者呢?
我有使用crypt的问题.我正在为客户重建一个网站.因此,以前的版本中有很多继承的代码.我必须保持站点原始数据库,所以我必须小心我改变代码的方式.之前的开发人员使用crypt()函数创建用于存储的用户密码哈希.我看到的奇怪效果是,相同密码的轻微变化有时会创建完全相同的哈希.我不太了解地穴如何运作,但在我看来,这不应该发生.这里有一些代码作为例子.
echo crypt('Colliedog6','wfd')."\n";
echo crypt('Colliedog10','wfd')."\n";
Run Code Online (Sandbox Code Playgroud)
这将在我的服务器上返回相同的哈希字符串.我正在使用那个salt字符串,因为这是以前的开发人员使用的,所有当前的密码都是使用该salt字符串制作的,所以我真的需要使用它,除非我们想强制所有用户重置密码.这不一定是不可能的,但我们想避免它.为什么crypt会像上面那样使用两个稍微不同的字符串并创建相同的哈希?
我正在我的网页上PHP 5.2不支持CRYPT_BLOWFISH,但是CRYPT_MD5,并且已经听说河豚比MD5更加安全.
由于我不是主管,我无法将PHP升级到支持它的版本.
CRYPT_BLOWFISH在PHP 5.2上使用有什么黑客攻击吗?
和,
$hash_key = crypt($something, '$2a$anySalt');
Run Code Online (Sandbox Code Playgroud)
在第一面正确贴上"$ 2a $"?
很困惑.
附言:如果我用crypt()用CRYPT_BLOWFISH,将在bcrypt工作做好crypt()的功能?
以下代码以任何方式返回相同的加密密码.为什么以及如何阻止这种情况.
$pwd = 'shits8888';
$salt = '50153fc193af9';
echo crypt($pwd,$salt)
Run Code Online (Sandbox Code Playgroud)
显然有些东西丢失了,因为这会返回相同的东西
$pwd = 'shits8888hjhfgnsdkjf8744884';
$salt = '50153fc193af9';
echo crypt($pwd,$salt)
Run Code Online (Sandbox Code Playgroud) 是否可以比较两个cryptDocs -ed字符串并查看它们是否匹配?
用户登录时,会创建一个会话,存储用户的ID及其对应的crypt密码哈希值.在后台,检查一直在运行,以查看会话(读取,密码)是否仍然有效.
所以从技术上讲,我想比较crypt数据库中的-ed密码和会话中的加密密码.这可能吗?
编辑:
应该说我使用以下方法来加密密码;
function better_crypt($input, $rounds = 7)
{
$salt = "";
$salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9));
for($i=0; $i < 22; $i++) {
$salt .= $salt_chars[array_rand($salt_chars)];
}
return crypt($input, sprintf('$2a$%02d$', $rounds) . $salt);
}
Run Code Online (Sandbox Code Playgroud) 我尝试编译以下代码(最小例子,请参阅整个代码的编辑):
// a.c
#include <stdio.h>
#define _XOPEN_SOURCE
#include <unistd.h>
int main(int argc, char* argv[])
{
puts((const char*) crypt("AAAA", "$6$2222"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用clang-7 -lcrypt a.c并发出以下警告:
minimum.c:8:24: warning: implicit declaration of function 'crypt' is invalid in C99 [-Wimplicit-function-declaration]
puts((const char*) crypt("AAAA", "$6$2222"));
^
minimum.c:8:10: warning: cast to 'const char *' from smaller integer type 'int' [-Wint-to-pointer-cast]
puts((const char*) crypt("AAAA", "$6$2222"));
^
2 warnings generated.
Run Code Online (Sandbox Code Playgroud)
但./a.out似乎确实有效:
$6$2222$6GKY4KPtBqD9jAhwxIZGDqEShaBaw.pkyJxjvSlKmtygDXKQ2Q62CPY98MPIZbz2h6iMCgLTVEYplzp.naYLz1
Run Code Online (Sandbox Code Playgroud)
我发现如果我删除#include <stdio.h>并puts喜欢这个:
// new_a.c
#define _XOPEN_SOURCE
#include …Run Code Online (Sandbox Code Playgroud) 我将密码哈希值存储在使用以下命令生成的 Postgresql 数据库中:
password_hash($password, PASSWORD_DEFAULT);
现在我还希望能够使用 Postgresql 和 pgcrypto 验证用户密码。
但 pgcrypto 的crypt()功能无法验证现有的密码哈希值。
但是 - 我可以使用 PHP 验证 Postgresql 生成的密码哈希值password_verify。
例如:
password_hash('hello', PASSWORD_DEFAULT);
$2y$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS
Run Code Online (Sandbox Code Playgroud)
postgres=# SELECT crypt('hello', gen_salt('bf'));
crypt
--------------------------------------------------------------
$2a$06$7/AGAXFSTCMu9r.08oD.UulYR0/05q7lmuCTC68Adyu/aNJkzpoIW
Run Code Online (Sandbox Code Playgroud)
确认:
// php_verify with the Postgresql hash
php > var_dump(password_verify('hello', '$2a$06$7/AGAXFSTCMu9r.08oD.UulYR0/05q7lmuCTC68Adyu/aNJkzpoIW'));
bool(true)
Run Code Online (Sandbox Code Playgroud)
postgres=# SELECT crypt('hello', '$2y$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS');
crypt
---------------
$2JgKNLEdsV2E
(1 Zeile)
Run Code Online (Sandbox Code Playgroud)
我的问题基本上是:
我花了一整夜时间研究这个没有解决方案.
我正在尝试验证驱动器文件夹(C:\ Windows\System32\drivers*.sys)中文件的数字签名选择您想要的任何内容.我知道代码是正确的,因为如果你将文件从该文件夹移动到C:\测试工作.
WinVerifyTrust给出错误80092003
http://pastebin.com/nLR7rvZe
CryptQueryObject给出错误80092009
http://pastebin.com/45Ra6eL4
这是怎么回事?
因为我使用的是旧版本的PHP,所以我必须使用.crypt().我正在测试一些密码验证,服务器验证错误的密码是正确的.然后我决定尽可能进行最基本的测试,我仍然有这个问题:
<?php
echo crypt("cryptcryptcrypt","salt");
echo "<br>";
echo crypt("cryptcryptcrypta","salta");
?>
Run Code Online (Sandbox Code Playgroud)
- 结果是:
saRyxun8Pn/K6
saRyxun8Pn/K6
Run Code Online (Sandbox Code Playgroud)
为什么这是hapening?
出于测试目的,我正在使用PhpFiddle,因此您在回答时可能会发现这很有用......