我的开发分为两个部分:
- 该网站是一个使用 FOSUserBundle 的 Symfony 应用程序,该应用程序使用 SHA512 和盐来加密密码。
- 一个用 C 语言编程的身份验证模块,一旦给出盐和明文密码,它应该能够重现 SHA512 加盐哈希。
关于我的环境的一些信息
- 我正在使用 Linux Ubuntu 12.04。
ldd --version
回答EGLIBC 2.15-0ubuntu10.4 2.15(也许我需要 2.7 ?但是apt-get
在正确升级软件包时真的很痛苦)。- 头
crypt.h
文件提到@(#)crypt.h 1.5 12/20/96
问题本身
我的问题出现在身份验证模块中:我无法获得与 Symfony 的 FOSUserBundle 生成的哈希值相同的哈希值。这是我的例子:
- Symfony 使用的密码 salt 是
bcccy6eiye8kg44scw0wk8g4g0wc0sk
. - 密码本身是
test
有了这些信息,Symfony 存储了这个最终的散列:
fH5vVoACB4e8h1GX81n+aYiRkSWxeu4TmDibNChtLNZS3jmFKBZijGCXcfzCSJFg+YvNthxefHOBk65m/U+3OA==
现在,在我的 C 身份验证模块中,我运行这段代码(crypt.h
包括在内):
char* password = "test";
char* salt = "$6$bcccy6eiye8kg44scw0wk8g4g0wc0sk";
char* hash = malloc(256);
memset(hash, 0, 256);
encode64(crypt(password, salt), hash, strlen(password));
fprintf(stdout, "%s\n", hash);
(这是我的 base64 编码器:http: //libremail.tuxfamily.org/sources/base64-c.htm)
这输出......
JDYkYg==
这与我的 Symfony2 哈希完全不同。
浏览堆栈溢出,我发现这个问题(Symfony2 (FOSUserBundle) SHA512 hash doesn't match C# SHA512 hash)由遇到相同问题的人编写(尽管使用 C#)。所以我决定运行这个测试......
char* password = "test{bcccy6eiye8kg44scw0wk8g4g0wc0sk}";
char* salt = "$6$bcccy6eiye8kg44scw0wk8g4g0wc0sk"; // I tried without salt, or with "$6$" as well.
char* hash = malloc(256);
memset(hash, 0, 256);
encode64(crypt(password, salt), hash, strlen(password));
fprintf(stdout, "%s\n", hash);
当然,这是一个彻底的失败,我得到:
JDYkYmNjY3k2ZWl5ZThrZzQ0cyRycmN6TnpJUXFOYU1VRlZvMA==
我尝试以各种方式混合密码和盐,但我永远无法在身份验证模块中获得 Symfony 的盐。路上有什么我错过的吗?我是否误解了 Symfony 的 FOSUserBundle 存储密码的方式?