当前位置: 首页 > 知识库问答 >
问题:

如何使用PHP为Dovecot生成加盐的SHA-512密码哈希

谷梁振
2023-03-14

我一直在使用PHP为Dovecot创建一个可用的盐渍SHA-512哈希。当创建一个非salt十六进制格式的哈希时,一切都很好。向哈希中添加一个盐,我无法再使用“doveadm pw”验证哈希。

这是我的代码:

    $password       = 'test';
    $salt           = '2fec1ee0940e7c436ef2037e89e4c06ca20b281a90dbb2d6cbd3534aa4ce7e19';

    // Create non-salted hashes
    $hash_hex       = "{SHA512.hex}" . hash('sha512', $password);
    $hash_b64       = "{SHA512.b64}" . base64_encode(hash('sha512', $password));

    // Create salted hashes
    $salted_hash_hex= "{SSHA512.hex}" . hash('sha512', $password . $salt) . $salt;
    $salted_hash_b64= "{SSHA512.b64}" . base64_encode(hash('sha512', $password . $salt) . $salt);

    // Output
    var_dump($hash_hex);
    var_dump($hash_b64);
    var_dump($salted_hash_hex);
    var_dump($salted_hash_b64);

var\u dumps()的输出如下:

string '{SHA512.hex}ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff' (length=140)
string '{SHA512.b64}ZWUyNmIwZGQ0YWY3ZTc0OWFhMWE4ZWUzYzEwYWU5OTIzZjYxODk4MDc3MmU0NzNmODgxOWE1ZDQ5NDBlMGRiMjdhYzE4NWY4YTBlMWQ1Zjg0Zjg4YmM4ODdmZDY3YjE0MzczMmMzMDRjYzVmYTlhZDhlNmY1N2Y1MDAyOGE4ZmY=' (length=184)
string '{SSHA512.hex}4a1e8a61780f449ef6cbc883b5cf57279d32fd004cb7298ddb6f8c46bf246187c03f1bf9447044708767a826e65f977e5c95a490abf8f2c3ca90c7a0ea2b89e82fec1ee0940e7c436ef2037e89e4c06ca20b281a90dbb2d6cbd3534aa4ce7e19' (length=205)
string '{SSHA512.b64}NGExZThhNjE3ODBmNDQ5ZWY2Y2JjODgzYjVjZjU3Mjc5ZDMyZmQwMDRjYjcyOThkZGI2ZjhjNDZiZjI0NjE4N2MwM2YxYmY5NDQ3MDQ0NzA4NzY3YTgyNmU2NWY5NzdlNWM5NWE0OTBhYmY4ZjJjM2NhOTBjN2EwZWEyYjg5ZTgyZmVjMWVlMDk0MGU3YzQzNmVmMjAzN2U4OWU0YzA2Y2EyMGIyODFhOTBkYmIyZDZjYmQzNTM0YWE0Y2U3ZTE5' (length=269)

现在,当我尝试根据doveadm验证哈希时,只有第一个哈希(十六进制格式的非salt)有效。第二个错误是关于字符串长度的错误(输入长度无效(128而不是64))。第三个和第四个表示密码不匹配:

root@jupiter[0][75]:/etc/dovecot# dovecot pw -t {SHA512.hex}ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff -p test
{SHA512.hex}ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff (verified)

root@jupiter[0][0]:/etc/dovecot# dovecot pw -t {SHA512.b64}ZWUyNmIwZGQ0YWY3ZTc0OWFhMWE4ZWUzYzEwYWU5OTIzZjYxODk4MDc3MmU0NzNmODgxOWE1ZDQ5NDBlMGRiMjdhYzE4NWY4YTBlMWQ1Zjg0Zjg4YmM4ODdmZDY3YjE0MzczMmMzMDRjYzVmYTlhZDhlNmY1N2Y1MDAyOGE4ZmY= -p test
doveadm(root): Fatal: reverse decode check failed: Input length isn't valid (128 instead of 64)

root@jupiter[0][75]:/etc/dovecot# dovecot pw -t {SSHA512.hex}4a1e8a61780f449ef6cbc883b5cf57279d32fd004cb7298ddb6f8c46bf246187c03f1bf9447044708767a826e65f977e5c95a490abf8f2c3ca90c7a0ea2b89e82fec1ee0940e7c436ef2037e89e4c06ca20b281a90dbb2d6cbd3534aa4ce7e19 -p test
doveadm(root): Fatal: reverse password verification check failed: Password mismatch

root@jupiter[0][75]:/etc/dovecot# dovecot pw -t {SSHA512.b64}NGExZThhNjE3ODBmNDQ5ZWY2Y2JjODgzYjVjZjU3Mjc5ZDMyZmQwMDRjYjcyOThkZGI2ZjhjNDZiZjI0NjE4N2MwM2YxYmY5NDQ3MDQ0NzA4NzY3YTgyNmU2NWY5NzdlNWM5NWE0OTBhYmY4ZjJjM2NhOTBjN2EwZWEyYjg5ZTgyZmVjMWVlMDk0MGU3YzQzNmVmMjAzN2U4OWU0YzA2Y2EyMGIyODFhOTBkYmIyZDZjYmQzNTM0YWE0Y2U3ZTE5 -p test
doveadm(root): Fatal: reverse password verification check failed: Password mismatch

我试图通过阅读几页来找出它是如何工作的,比如

  • http://wiki2.dovecot.org/Authentication/PasswordSchemes

认为我做得对。但是:没有没有;-)

有人能指出我的错误吗?

非常感谢你!

共有1个答案

郭璞
2023-03-14
hash('sha512', $password, true)

既然你是Base64编码

 类似资料:
  • 问题内容: 我一直在研究一些有关Java字符串加密技术的信息,但不幸的是,我还没有找到如何在Java中使用SHA-512对String进行哈希处理的很好的教程。我读了一些有关MD5和Base64的博客,但是它们并不像我想要的那样安全(实际上,Base64不是一种加密技术),所以我更喜欢SHA-512。 问题答案: 您可以将其用于SHA-512

  • 作为练习,我用C编写了自己的SHA-512哈希函数实现。我知道它是有效的,因为我从abc 在Base64中。就像在测试现场一样。 我有两个问题: > 如何加密我的密码?如果我有: 我应该创建字符串以输入盐通过="ssssssssmy密钥密码"吗?或者可能以相反的方式?我试图在谷歌上到处寻找答案——我找不到真正合适的东西。 在base64中,我应该使用什么编码来获得像/etc/shadow文件中那样

  • 我想找到一个解决方案或方法,使我能够添加盐和控制迭代次数。本机Rfc2898DeriveBytes基于HMACSHA1。理想情况下,使用SHA-256或SHA-512将使系统经得起未来的考验。 这是迄今为止我发现的最好的例子:http://jmedved.com/2012/04/pbkdf2-with-sha-256-and-others/但是当我用SHA-256运行它时,它实际上比用SHA-51

  • 我认为我理解散列和加盐密码,但似乎我有一些误解。我在nodejs为我的网站创建一个用户帐户系统。 我的理解是,当用户创建密码时,我们会生成一个随机盐,将其附加到密码中,然后散列该字符串。我们还可以添加一个工作因子以使散列工作缓慢并防御蛮力攻击。我们将盐与散列一起存储在我们的数据库中,为了验证登录尝试,我们使用存储的盐和尝试的密码重复上述过程(在服务器上),并检查散列是否匹配。 nodejs中的模块

  • 问题内容: 目前,据说MD5部分不安全。考虑到这一点,我想知道使用哪种机制进行密码保护。 这个问题,“双重哈希”密码是否比仅哈希一次密码安全? 建议多次散列可能是一个好主意,而如何对单个文件实施密码保护?建议使用盐。 我正在使用PHP。我想要一个安全,快速的密码加密系统。将密码哈希一百万次可能更安全,但也更慢。如何在速度和安全性之间取得良好的平衡?另外,我希望结果具有恒定数量的字符。 哈希机制必须

  • 我正在使用。NET Bcrypt哈希实现来自第三方库,它具有创建哈希的方法,只需提供文本或密码,如下所示。 我知道生成的hash包含salt信息,但在创建hash时它没有获取salt参数。 Bcrypt在内部创建随机盐并使用它? 如果我不使用salt重载方法,它会导致安全漏洞吗?