C# 将字节[]复制到另一个字节[]时出现问题
我有一个创建哈希密码的方法。 但是它在salt.CopyTo(pwd,0)下崩溃; 表示目标字节[]太小。 我如何解决这个问题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
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建议后我的代码的样子。