Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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#_Byte - Fatal编程技术网

C# 将字节[]复制到另一个字节[]时出现问题

C# 将字节[]复制到另一个字节[]时出现问题,c#,byte,C#,Byte,我有一个创建哈希密码的方法。 但是它在salt.CopyTo(pwd,0)下崩溃; 表示目标字节[]太小。 我如何解决这个问题 public static byte[] CreateHashedPassword(string password, byte[] salt) { SHA1 sha1 = SHA1.Create(); byte[] pwd = CustomHelpers.StringToByteArray(password

我有一个创建哈希密码的方法。 但是它在salt.CopyTo(pwd,0)下崩溃; 表示目标字节[]太小。 我如何解决这个问题

public static byte[] CreateHashedPassword(string password, byte[] salt)
        {
            SHA1 sha1 = SHA1.Create();
            byte[] pwd = CustomHelpers.StringToByteArray(password);
            salt.CopyTo(pwd, 0);
            sha1.ComputeHash(pwd);

            return pwd;            
        }

您需要创建一个较长的字节数组以同时包含salt和密码:

    byte[] result = new byte[salt.Length + password.Length];
    salt.CopyTo(result, 0);
    password.CopyTo(result, salt.Length);
byte[] pwdAndSalt = new byte[pwd.Length + salt.Length];
for (int i = 0; i < pwdAndSalt.Length; i++)
{
    if (i < salt.Length)
    {
        pwdAndSalt[i] = salt[i];
    }
    else
    {
        pwdAndSalt[i] = pwd[i - salt.Length];
    }
}

盐有多大?您是否打算将其添加到密码中

以下是如何将其添加到密码的开头:

    byte[] result = new byte[salt.Length + password.Length];
    salt.CopyTo(result, 0);
    password.CopyTo(result, salt.Length);
byte[] pwdAndSalt = new byte[pwd.Length + salt.Length];
for (int i = 0; i < pwdAndSalt.Length; i++)
{
    if (i < salt.Length)
    {
        pwdAndSalt[i] = salt[i];
    }
    else
    {
        pwdAndSalt[i] = pwd[i - salt.Length];
    }
}
byte[]pwdAndSalt=新字节[pwd.Length+salt.Length];
for(int i=0;i
也许是这样的

public static byte[] CreateHashedPassword(string password, byte[] salt) 
{ 
    SHA1 sha1 = SHA1.Create(); 
    byte[] pwd = CustomHelpers.StringToByteArray(password);
    byte[] pwdPlusSalt = new byte[salt.Length + pwd.Length];
    salt.CopyTo(pwdPlusSalt, 0); 
    pwd.CopyTo(pwdPlusSalt, salt.Length); 

    return sha1.ComputeHash(pwdPlusSalt);
}

你真的打算用salt覆盖密码SHA生成的部分字节,还是打算在这些字节之前插入salt?我的意图是在将它们散列在一起之前,将salt添加到密码的开头。这不应该是随机的,你需要知道用散列和盐渍密码测试密码是什么。扎克:应该是随机的,但你应该保留一份副本。但我现在已经改变了我的答案,因为我意识到他试图做什么(在数组的开头插入字节)。据我所知,它不必是随机的,因为salt的目的是击败彩虹表攻击。即使坏人知道salt是什么,他们仍然必须手动计算密码的哈希值。如果salt对于您使用的每个密码都是相同的,那么您仍然没有阻止字典攻击。salt的要点是,攻击者一次只能对您的密码数据库强制执行一个密码,而不是一次执行所有密码。非常感谢你。是的,我的密码是随机的。这是最安全的方法。谢谢Jeffrey,这正是添加Mark建议后我的代码的样子。