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

RNGCryptoServiceProvider不会为相同的PWD、Salt和迭代组合生成相同的哈希

燕成双
2023-03-14

所以我想通过添加随机盐来散列我的密码。网。我为此使用的内置类是RNGCryptoServiceProvider-生成随机盐和Rfc2898DeriveBytes-散列实际密码。

但是当我为相同的passwordString组合调用Rfc2898DeriveBytes的GetBytes()函数时,SaltBytes

    public class PBKDF2Implementation
    {
        int minSaltSize = 32;
        int maxSaltSize = 64;


        public string CreateHash(string plainText , out string  salt)
        {
            Random random = new Random();
            int saltSize = random.Next(minSaltSize, maxSaltSize);

            // Allocate a byte array, which will hold the salt.
            byte[] saltBytes = new byte[saltSize];

            // Initialize a random number generator.
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            // Fill the salt with cryptographically strong byte values.
            rng.GetNonZeroBytes(saltBytes);

            string strSalt = System.Text.Encoding.ASCII.GetString(saltBytes);
            //string strSalt = System.Convert.ToBase64String(saltBytes);
            salt = strSalt;

            Console.WriteLine(saltBytes.Count());
            Console.WriteLine(strSalt);

            Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes(plainText, saltBytes, 1000);

            // generate an RC2 key
            byte[] key = pwdGen.GetBytes(32);

            Console.WriteLine(System.Convert.ToBase64String(key));
            return System.Convert.ToBase64String(key);
        }

        public bool CompareHash(string plainText, string salt, string hashValue)
        {

            byte[] saltBytes = System.Text.Encoding.ASCII.GetBytes(salt);
            //byte[] saltBytes = System.Convert.FromBase64String(salt);

            Console.WriteLine(saltBytes.Count());
            Console.WriteLine(System.Text.Encoding.ASCII.GetString(saltBytes));

            Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes(plainText, saltBytes, 1000);

            // generate an RC2 key
            byte[] key = pwdGen.GetBytes(32);

            Console.WriteLine(System.Convert.ToBase64String(key));
            return System.Convert.ToBase64String(key) == hashValue;
        }
    }

在我的测试课上,我有这个函数

    [Test]
    public void shouldGenerateConsistentHash()
    {
        PBKDF2Implementation cPbkdf2Implementation = new PBKDF2Implementation();
        string salt;
        string hashValue = cPbkdf2Implementation.CreateHash("password", out salt);

        bool result = cPbkdf2Implementation.CompareHash("password", salt, hashValue);
        Assert.IsTrue(result) ;
    }

测试失败了
但是如果在上面的类PBKDF2实现中,如果我替换了行系统。文本编码。ASCII码。使用系统获取字符串。文本编码。Unicode。获取字符串和系统。文本编码。ASCII码。使用系统获取字节。文本编码。Unicode。GetBytes

测试通过了。知道为什么会这样吗?我想让它与ASCII编码一起工作的原因是因为存储这个hashvalue的同一个数据库也将被PHP应用程序使用

下面是同一个http://www.php.net/manual/en/function.hash-hmac.php#101540的PHP实现

共有1个答案

王英奕
2023-03-14
  1. 避免使用带有加密的字符串。使用字节数组,即字节[]

例如。

byte [] data = new byte [] { 65, 0, 65 };
var s = System.Text.Encoding.ASCII.GetString (data);

什么是s值?

答:"A"

如果从同一个字符串中请求字节[],您将得到:字节[1]{65},它与原始的不一样,对于大多数加密用法都不起作用。

Base64更安全,因为它将保持每个字节完整。

 类似资料:
  • 最近,我参加了一次面试,遇到了一个关于哈希碰撞的很好的问题。 问题:给出一个字符串列表,把字谜一起打印出来。 示例: I/P: 、 、 、 、 、 、 、 、 、 、 、 、 {行为,上帝,动物,狗,猫} O/P:               演戏,猫,狗,上帝 我要创建hashmap并将单词作为键,将值作为字母表列表 为了避免冲突,我想为字母表生成唯一的哈希代码,而不是排序并使用排序后的单词作为

  • 问题内容: 这个问题与PHP的实现有关。对于此问题,不计算盐的前7个字符,因此盐’ ‘的长度为1,因为它仅是盐的1个字符和元数据的7个字符。 当使用长度超过22个字符的盐字符串时,生成的哈希值不会发生变化(即,截断),而当使用长度小于21个字符的字符串时,盐将被自动填充(显然带有’ ‘字符);这非常简单。但是,如果给定一个Salt 20个字符和Salt 21个字符,并且除了21个长度的salt的最

  • 本文向大家介绍java集合与数组的相同点和不同点,包括了java集合与数组的相同点和不同点的使用技巧和注意事项,需要的朋友参考一下 数组: 数组可以用来保存多个基本数据类型的数据,也可以用来保存多个对象。 数组的长度是不可改变的,一旦初始化数组时就指定了数组的长度(无论是静态初始化还是动态初始化)。 数组无法保存具有映射关系的数据。 集合: 集合是只用于存储数量不等的对象。 集合的长度是可变的。

  • 对于以下地图: 这是代码。。。 ...保证两次打印相同的序列? 如果没有,在例如< code>java.util.HashMap中是否有任何保证?

  • 或者他是对的,使用默认的object.hashCode()实现,我们永远不会发生冲突,即两个不同的对象永远不会有相同的hashCode。如果是的话,为什么那么多的java手册没有明确地这么说。 我如何编写一些代码来演示这一点呢?因为通过演示,我还可以证明hashmap中的bucket可以包含不同的hashcode(我试图向他展示hashmap在哪里展开的调试器,但他告诉我这只是逻辑实现,而不是内部

  • 问题内容: 我有一个函数可以在C#中生成MD5哈希,如下所示: 在Java中,我的函数如下所示: C#代码生成:“ 02945C9171FBFEF0296D22B0607D522D”时,Java代码生成:“ 5a700e63fa29a8eae77ebe0443d59239”。 有没有办法为相同的字节数组生成相同的md5哈希? 一经请求: 这是java中的测试代码: 这是我在C#中的代码 干杯 问题