Freigeben über


Der .NET Framework 4.6.2-Clienttreiber für Always Encrypted schlägt während der Zeilenentschlüsselung zeitweise fehl.

Dieser Artikel enthält Eine Lösung für das Problem, das dazu führt, dass die .NET Framework 4.6.2-Clientanwendung beim Zugriff auf Daten aus einer immer verschlüsselten Datenbank fehlschlägt.

Originalproduktversion: SQL Server 2016, SQL Server 2017
Ursprüngliche KB-Nummer: 3204545

Problembeschreibung

Sie verfügen über eine Clientanwendung, die das .NET Framework-Datenanbieter für Microsoft SQL Server (Sqlclient) verwendet, das in Microsoft .NET Framework 4.6.2 enthalten ist. Sie verwenden diese Anwendung, um eine Verbindung mit einer immer verschlüsselten Datenbank herzustellen, die unter Microsoft SQL Server 2016, SQL Server 2017 unter Windows oder Microsoft Azure SQL-Datenbank ausgeführt wird.

Wenn Sie versuchen, die Datensätze aus der Always Encrypted-aktivierten Datenbank zu entschlüsseln, erhalten Sie zeitweilige Fehlermeldungen, die dem folgenden Fehler ähneln:

Die Entschlüsselung ist fehlgeschlagen. Die letzten 10 Bytes des verschlüsselten Spaltenverschlüsselungsschlüssels sind: 7E-0B-E6-D3-39-CE-35-86-2F-AA. Die ersten 10 Bytes von Chiffretext sind: 01-C3-D7-39-33-2F-E6-44-C3-B1. Der angegebene Chiffretext weist ein ungültiges Authentifizierungstag auf.

Wenn dieses Problem auftritt, werden Abfragen für Spalten, die durch die Einstellung "Immer verschlüsselt " geschützt sind, möglicherweise falsche Ergebnisse angezeigt, z. B. zu wenige Datensätze werden zurückgegeben. Dies wiederum kann ein falsches Verhalten auslösen. Die Clientanwendung versucht beispielsweise, fehlende Werte einzufügen oder andere Aktualisierungsprozesse auszuführen, die entweder zusätzliche Fehler verursachen oder inkonsistente Daten in der Datenbank verursachen.

Lösung

Um dieses Problem zu beheben, installieren Sie das Sicherheitsupdate aus dem Microsoft-Sicherheitsbulletin MS16-155.

Problemumgehung

Wichtig

Wenn Ihre Clientanwendung über Web-Apps in Microsoft Azure-App Dienst gehostet wird, verwendet der Client automatisch .NET Framework 4.6.2. Daher können Sie auf das Problem stoßen, das im Abschnitt "Symptome" erwähnt wird. In diesem Szenario können Sie nur die Problemumgehung "Methode 2" ("Spaltenverschlüsselung deaktivieren") in diesem Abschnitt verwenden, bis eine Lösung für dieses Problem veröffentlicht wird.

Befolgen Sie die folgenden Richtlinien, um dieses Problem zu umgehen:

  • Der .NET-Client wird noch nicht auf Version 4.6.2 aktualisiert.

    In den Umgebungen, die im Abschnitt "Symptome " erwähnt werden, empfehlen wir, dass Sie kein Upgrade auf .NET Framework 4.6.2 durchführen, bis dieses Problem behoben ist. Dieses Problem wirkt sich nicht auf frühere Versionen des Treibers aus.

  • Der .NET-Client wird bereits auf 4.6.2 aktualisiert.

    Verwenden Sie eine der folgenden Methoden:

    • Methode 1: Zurücksetzen der .NET Framework-Version

      Deinstallieren Sie .NET Framework 4.6.2 aus den Hostclientanwendungen des Systems. Dadurch werden die Anwendungen gezwungen, eine ältere Version von NET Framework Datenanbieter für SQL Server zu verwenden, die dieses Problem nicht aufweist. Gehen Sie dazu wie folgt vor:

      1. Öffnen Sie in Systemsteuerung das Element "Programme", und wählen Sie dann "Programme und Features" aus.
      2. Wählen Sie "Installierte Updates anzeigen" aus, und deinstallieren Sie dann Update für Microsoft Windows KB3120737.

      Notiz

      Es wird empfohlen, dass Sie nach der Deinstallation einer version von .NET Framework .NET Framework abhängige Anwendungen testen. Diese Anwendungen funktionieren möglicherweise nicht ordnungsgemäß, wenn Sie die Version von .NET Framework deinstallieren, von der sie abhängig sind.

    • Methode 2: Deaktivieren des Zwischenspeicherns von Spaltenverschlüsselungsschlüsseln

      Wenn Sie das Rollback der .NET Framework-Installation nicht ausführen können, deaktivieren Sie die Zwischenspeicherung des Spaltenverschlüsselungsschlüssels (Column Encryption Key, CEK). Legen Sie dazu die SqlConnection.ColumnEncryptionKeyCacheTtl-Eigenschaft in der Clientanwendung auf 0 fest. Führen Sie beispielsweise den folgenden Code aus, um die Spaltenverschlüsselung in C#-Anwendungen zu deaktivieren:

      System.Data.SqlClient.SqlConnection.ColumnEncryptionKeyCacheTtl = TimeSpan.Zero
      

Vergewissern Sie sich, dass der Fehler während einer Tabellenüberprüfung (z. B. SELECT * FROM-Tabelle <mit Always Encrypted>) nicht mehr angezeigt wird, die aus einem Abfragefenster in SSMS über eine Datenbankverbindung ausgeführt wird, die im Verbindungszeichenfolge aktiviert ist. Durch ausführen dieser Art von Überprüfung wird die richtige Verschlüsselung überprüft.

Wichtig

Benutzer, die das Problem feststellen, das im Abschnitt "Symptome " während der Überprüfung beschrieben wird, sollten sich an wenden sqlalwaysencrypted@microsoft.com. Das Supportteam kann dabei helfen, alle zuvor verschlüsselten Zeilen wiederherzustellen, die von diesem Fehler betroffen sind. Dieser Fehler verursacht keinen dauerhaften Datenverlust.

References

.NET Framework 4.6.2-Clienttreiber für Always Encrypted führt zu zeitweiligen Fehlern beim Entschlüsseln einzelner Zeilen.