Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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#_Security_Xamarin.forms_Hash_Salt - Fatal编程技术网

C#存储登录时用于注册的盐

C#存储登录时用于注册的盐,c#,security,xamarin.forms,hash,salt,C#,Security,Xamarin.forms,Hash,Salt,我在思考问题。 我为我的Xamarin.Forms应用程序创建了一个注册/登录系统。现在,当我注册一个帐户时,我散列密码并添加随机盐,但我对登录做同样的操作。问题是,我需要获得与我在注册表上使用的密码完全相同的密码 以下是创建salt和hasing的两个函数: public String CreateSalt(int size) { var rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); var

我在思考问题。 我为我的Xamarin.Forms应用程序创建了一个注册/登录系统。现在,当我注册一个帐户时,我散列密码并添加随机盐,但我对登录做同样的操作。问题是,我需要获得与我在注册表上使用的密码完全相同的密码

以下是创建salt和hasing的两个函数:

public String CreateSalt(int size)
{
    var rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
    var buff = new byte[size];
    rng.GetBytes(buff);
    return Convert.ToBase64String(buff);
}

public String GenerateSHA256Hash(String input, String salt)
{
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
    System.Security.Cryptography.SHA256Managed sha256hashstring =
        new System.Security.Cryptography.SHA256Managed();
    byte[] hash = sha256hashstring.ComputeHash(bytes);

    return Convert.ToBase64String(hash);
}
以下是我在注册和登录时使用的代码:

async void btnLogInClicked(object sender, EventArgs args)
{
    string username = txtUsername.Text;
    string password = txtPassword.Text;

    string salt = CreateSalt(16);
    string HashedPassword = GenerateSHA256Hash(password, salt);
    HashedPassword = HashedPassword.Replace('+', '-');
    HashedPassword = HashedPassword.Replace('/', '_');

    User user = new User
    {
        Username = username,
        Password = HashedPassword
    };

    var result =  await App.RestService.Login(user);
    if (result != null)
    {
        App.Current.MainPage = new SideMenuItems();
    }
}

我如何才能做到这一点,并且仍然对每个新生成的密码使用随机salt?

似乎每年我都必须重新学习如何正确地散列密码。我刚才就这么做了,我会尽力解释的

您的问题是,当用户登录时,每次调用
CreateSalt
,您都会生成一个新的salt。如注释中所述,您需要在注册期间生成一次salt和hash,并将它们保存到数据库中

然后,当用户登录时,您可以从数据库中检索salt,并将其与用户输入的密码一起使用以生成哈希。最后,将新生成的哈希与保存在数据库中的哈希进行比较,以查看密码是否正确

我建议使用慢速散列算法,而不是SHA256来生成散列。PBKDF2将是一个很好的选择,并且内置了.NET作为类。另一个流行的选择是bcrypt。它需要一个.NET中的第三方库,但我发现它很容易实现(至少对于Node是如此)。更多关于密码哈希算法的一般信息


最后要考虑的是算法使用的迭代次数。

Rfc2898DeriveBytes
类有几个构造函数,其中一个将默认值设置为1000次迭代,这应该足够了。迭代(或“成本”)降低了哈希函数的速度,有助于阻止攻击。

首先,对登录进行哈希和盐/哈希不是有点不寻常吗?你指的是用户名/电子邮件吗?我用用户名和密码登录。现在在注册页面上,我对密码进行了salt/hash操作,但在登录时我也做了同样的操作。。。。问题是密码永远不会以这种方式匹配!请分享你的一些代码。我们需要知道你现在在哪里。我添加了代码。。。。登录和注册几乎是一样的,除了我调用的函数!salt不是秘密的,您通常使用散列值未加密地存储它的值。登录时,您将为用户查找保存的salt,并在验证密码时使用它。