CA5379: Se till att algoritmen för nyckelhärledningsfunktionen är tillräckligt stark
Property | Värde |
---|---|
Regel-ID | CA5379 |
Title | Se till att algoritmen för nyckelhärledningsfunktionen är tillräckligt stark |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
Använd någon av följande algoritmer när du instansierar System.Security.Cryptography.Rfc2898DeriveBytes:
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- En algoritm som regeln inte kan fastställa vid kompileringstillfället
Regelbeskrivning
Klassen Rfc2898DeriveBytes använder som standard algoritmen SHA1 . När du instansierar ett Rfc2898DeriveBytes objekt bör du ange en hash-algoritm på SHA256 eller högre. Observera att Rfc2898DeriveBytes.HashAlgorithm egenskapen bara har en get
accessor.
Så här åtgärdar du överträdelser
Eftersom MD5 eller SHA1 är sårbara för kollisioner, användning SHA256 eller högre för Rfc2898DeriveBytes klassen.
Äldre versioner av .NET Framework eller .NET Core kanske inte tillåter att du anger en hash-algoritm för nyckelhärledningsfunktionen. I sådana fall måste du uppgradera målramverksversionen av .NET för att använda en starkare algoritm.
När du ska ignorera varningar
Vi rekommenderar inte att du utelämnar den här regeln förutom av programkompatibilitetsskäl.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA5379.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel på pseudokod
Ange hash-algoritm i konstruktoröverträdelse
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
{
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.MD5);
}
}
Ange hash-algoritm i den härledda klassens konstruktoröverträdelse
using System.Security.Cryptography;
class DerivedClass : Rfc2898DeriveBytes
{
public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
{
}
}
class ExampleClass
{
public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
{
var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
}
}
Ange hash-algoritmegenskap i överträdelse av härledda klasser
using System.Security.Cryptography;
class DerivedClass : Rfc2898DeriveBytes
{
public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
{
}
public HashAlgorithmName HashAlgorithm { get; set;}
}
class ExampleClass
{
public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
{
var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
derivedClass.HashAlgorithm = HashAlgorithmName.SHA256;
}
}
Lösning
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
{
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256);
}
}