Share via


CA5379: Se till att algoritmen för nyckelhärledningsfunktionen är tillräckligt stark

Property Värde
Regel-ID CA5379
Rubrik 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 8 Nej

Orsak

Använd någon av följande algoritmer när du instansierar System.Security.Cryptography.Rfc2898DeriveBytes:

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);
    }
}