== How to fix it in ASP.NET

=== Code examples

==== Noncompliant code example

[source,csharp,diff-id=201,diff-type=noncompliant]
----
using System.Security.Cryptography;

RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
byte[] salt = new byte[32];
rngCsp.GetBytes(salt);
Rfc2898DeriveBytes kdf = new Rfc2898DeriveBytes(password, salt, 100, HashAlgorithmName.SHA256); // Noncompliant
string hashed = Convert.ToBase64String(kdf.GetBytes(256 / 8));
----

Using `using Microsoft.AspNet.Identity`:
[source,csharp]
----
using Microsoft.AspNet.Identity;

string password = "NotSoSecure";
PasswordHasher hasher = new PasswordHasher();
string hash = hasher.HashPassword(password); // Noncompliant
----

==== Compliant solution

[source,csharp,diff-id=201,diff-type=compliant]
----
using System.Security.Cryptography;

RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
byte[] salt = new byte[32];
rngCsp.GetBytes(salt);
Rfc2898DeriveBytes kdf = new Rfc2898DeriveBytes(password, salt, 100_000, HashAlgorithmName.SHA256); // Compliant
string hashed = Convert.ToBase64String(kdf.GetBytes(256 / 8));
----

=== How does this work?

include::../../common/fix/pbkdf2-parameters.adoc[]

=== Going the extra mile

include::../../common/extra-mile/peppering.adoc[]

