Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于输入字符串-C的固定盐生成#_C#_Encryption_Cryptography_Salt - Fatal编程技术网

C# 基于输入字符串-C的固定盐生成#

C# 基于输入字符串-C的固定盐生成#,c#,encryption,cryptography,salt,C#,Encryption,Cryptography,Salt,我有一个简单的类,它有两个方法: private static byte[] PBKDF2(string field, byte[] salt, int iterations, int outputBytes) { Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(field, salt); pbkdf2.IterationCount = iterations; return pbkdf2

我有一个简单的类,它有两个方法:

private static byte[] PBKDF2(string field, byte[] salt, int iterations, int outputBytes)

   {
        Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(field, salt);
        pbkdf2.IterationCount = iterations;
        return pbkdf2.GetBytes(outputBytes);
    }

public static string CreateHash(string field, String salt)
    {
        //if (Array.TrueForAll(salt, x => x == 0))
        //{
        //    RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider();
        //    csprng.GetBytes(salt);
        //    string s = Convert.ToBase64String(salt);
        //}
        byte[] salts = Encoding.ASCII.GetBytes(salt);
        byte[] hash = PBKDF2(field, salts, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);
        return Convert.ToBase64String(hash);
    }
我需要提供一个前端,用户在其中输入一个简单的字符串,如“abc”,我需要根据它生成salt。这就是我将要存储在数据库中的内容,并使用它传递给上面的方法(CreateHash)以取消标识 数据。这个salt/密钥需要能够被解密回来,我必须在前端展示

我也可以使用其他类/库。它不必是Rfc2898DeriveBytes

请提供一些关于如何实现此salt/密钥生成功能的信息。这盐不能是随机值


谢谢

您提到需要解密散列字符串

PBKDF2不是一个加密算法,而是一个密钥派生函数,无论有无salt,您都无法从结果哈希计算原始输入

您应该寻找的是加密,而不是散列


请看一些示例。

盐应该是随机的,而不是基于用户输入。salt的全部意义在于,如果有人输入相同的输入两次,您将得到两个不同的输出。如果您这样做是因为在验证
字节[]
时需要“了解盐”,那么您所需要做的只是在二进制blob的前面或后面添加盐,当您进行验证时,您可以将盐取出并将其输入PBKDF2函数。可能的话,但它使用的是Rfc2898。。。你为什么不想用它?@ScottChamberlain我知道盐应该是动态的,但这里的要求不同。这不是用于密码存储的。我们需要去识别数据并将其存储在文件中。每次一个文件包含一些数据时,我们都会加密并生成另一个文件。所有个人信息都已取消标识。但是,例如,对于一个给定的字段,比如名字David,它总是需要转换为与先前生成的相同的加密字符串。这不是我定义的!如果我将salt和pass修复为Rfc2898DeriveBytes,以获得相同输入的相同字符串。那么为什么要使用
Rfc2898DeriveBytes
而不仅仅是一个简单的散列呢?@ScottChamberlain简单散列不够安全,而且最终的散列需要是单向散列……在我们的例子中,salt可以解密,但最终加密的字符串是单向加密的。