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

pbkdf2-sha256哈希算法问题

水麒
2023-03-14

求求你帮帮我!我正在尝试使用pbkdf2-sha256算法哈希密码。Password=“user1”,salt=“ifo7kxyswe7fiu3bovnowg=”,hashIterations=“27500”。我知道结果。必须类似于“ZnxO94AYITK7T+OJ1PXPZTVEQ+G82LFWT6VNSTBHZPEUWZGMPRJJVKAUEXGH1IQPZWMX1SRVTUMLN/JCM8GC4G==”。.通过在线加密程序(https://8gwifi.org/pbkdf.jsp)验证结果-匹配。

联机加密器结果

但是,当我自己加密密码时,我会得到不同的结果。也许问题出在编码上。我哪里犯错了?谢谢!

我的代码:

import org.apache.commons.codec.binary.Hex;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.spec.KeySpec;
import java.util.Base64;

String PASSWORD = "user1";
String SALT = "IFo7KXYswe7Fiu3BoVNOWg==";
int ITERATION_COUNT = 27500;
int KEY_LENGTH = 256;

KeySpec spec = new PBEKeySpec(
        PASSWORD.toCharArray(),
        SALT.getBytes(),
        ITERATION_COUNT,
        KEY_LENGTH
);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
SecretKey secretKey = factory.generateSecret(spec);
byte[] hash = secretKey.getEncoded();

System.out.println("----hashStr----");
System.out.println(new String(hash, StandardCharsets.UTF_8));
System.out.println("----hashStrBase64----");
System.out.println(Base64.getEncoder().encodeToString(hash));
System.out.println("----hexHashString----");
System.out.println(Hex.encodeHexString(hash));

结果:

----hashStr----
=�I ��'��mh�W0y"��H��a�
�y 
----hashStrBase64----
Pe0BSRYglbEn+/htaPxXMA95IozqSJPisGGwChuheSA=
----hexHashString----
3ded0149162095b127fbf86d68fc57300f79228cea4893e2b061b00a1ba17920

共有1个答案

娄弘
2023-03-14

问题是salt.getBytes()

这将获得SALT的原始字节值。

但是,salt似乎是用Base64编码的(Base64经常附加=-符号,以便长度匹配):

输入Base64空salt将生成随机的16位salt值

您可以使用它来解码base64-salt:

KeySpec spec = new PBEKeySpec(
        PASSWORD.toCharArray(),
        Base64.getDecoder().decode(SALT),
        ITERATION_COUNT,
        KEY_LENGTH
);
 类似资料:
  • 我想向用户展示他们的客户端工具也可能生成的散列,因此我一直在比较在线散列工具。我的问题是关于它们的散列形式,因为奇怪的是,它们是不同的。 在快速搜索之后,我用5进行了测试: http://www.convertstring.com/hash/sha256 http://www.freeformatter.com/sha256-generator.html#ad-output http://onli

  • 我是相对较新的PHP,刚刚开始掌握盐的点,当谈到散列密码(我想?)。不管怎样,这是我的问题... 现在我有一个mysql数据库,用户名,密码,盐字段。密码字段长度为64个字符,盐字段为3个字符。在注册时,每个用户名被分配一个随机的盐。我对此没有任何问题(我相信)。首先,通过以下方式散列用户所需的密码: 然后,通过以下过程将用户所需的密码与pbkdf2中包含的盐进行散列,并将其输入数据库: 我的问题

  • 我使用mitsuhiko的pbkdf2实现进行密码哈希: 此函数返回二进制摘要,然后将其编码在bas64中并保存到数据库中。此外,当用户登录时,Base64字符串被设置为cookie。 此函数用于密码哈希比较: 我想知道在安全性方面,二进制哈希和Base64字符串的比较是否有任何不同?例如,当用户登录时,我会计算提交密码的二进制摘要,从数据库中解码Base64字符串,然后比较两个二进制哈希,但是如

  • 在这里找到了一些示例代码,但这只适用于SHA1。代码的关键位是: 我需要把这个从SHA1改成SHA256。 从Java文档和这篇文章来看,下面的内容似乎是可能的,但是C#库中的构造函数没有重载。

  • 问题内容: 我将使用密码+ salt 来运行,但是我不知道在设置MySQL数据库时需要花费多长时间。好的长度是多少? 问题答案: sha256长256位-顾名思义。 由于sha256返回一个十六进制表示,所以4个位足以编码每个字符(而不是8个,如ASCII),因此256个位将表示64个十六进制字符,因此您需要a 或什至a ,因为长度始终相同,完全没有变化。 和演示: 会给你 : 即一个包含64个字