为什么会出现此 DataProtectionProvider 错误
Why this DataProtectionProvider Error Occurs
我正在使用 DataProtectionProvider class 测试配置数据保护。测试代码以一种方式工作,但以另一种方式失败。
测试环境:
应用程序类型:ASP.NET 6 控制台应用程序与 c#
包:Microsoft.AspNetCore.DataProtection.Extensions 6.0.3
IDE:VS 2022
测试项目:ProtectData
问题描述:
在 DataProtector class 中有 3 个方法(参见测试代码 #1)。
TestProtector 方法用于初始测试。它以相同的方法加密和解密数据。没有任何问题
在 EncryptData 和 DecryptData 方法中,该过程分为 2 个独立的步骤。 运行ning用这些方法测试时,异常出现在语句的DecryptData方法:decrypted = protector.Unprotect(encryptedData);异常信息显示在以下屏幕截图中。
测试是 运行 使用 program.main 方法(参见测试代码 $2)
问题:
将“TestProtector”方法中的代码与这两种方法中的代码进行比较时,它们都以相同的方式使用相同的键处理过程。为什么一种方法完美,而“两步法”总是失败?这真的让我很困惑。我将不胜感激任何有关故障排除的帮助或建议。
测试代码
---- 测试代码 #1(使用 DataProtectionProvider 的控制台应用程序)
using Microsoft.AspNetCore.DataProtection;
using System;
namespace ProtectData
{
public static class DataProtector
{
public static string EncryptData(string inputText)
{
string encrypted = string.Empty;
try
{
var dataProtectionProvider = DataProtectionProvider.Create($".\appconfig.txt");
var protector = dataProtectionProvider.CreateProtector("protect data");
//var protectedPayload = protector.Protect(inputText);
encrypted = protector.Protect(inputText);
}
catch (Exception ex)
{
Console.WriteLine("ERROR: " + ex.Message);
}
return encrypted;
}
public static string DecryptData(string encryptedData)
{
string decrypted = string.Empty;
try
{
var dataProtectionProvider = DataProtectionProvider.Create($".\appconfig.txt");
var protector = dataProtectionProvider.CreateProtector("protect conn string");
decrypted = protector.Unprotect(encryptedData);
}
catch(Exception ex)
{
Console.WriteLine("ERROR: " + ex.Message, ex);
}
return decrypted;
}
public static void TestProtector()
{
string inputText = "DataSource=localhost, database=testdb, userID=appuser, password=topsecret";
Console.WriteLine($"inputText:\n{inputText}\n");
string encrypted = string.Empty;
string decrypted = string.Empty;
try
{
// encrypt given string
var dataProtectionProvider = DataProtectionProvider.Create($".\appconfig.txt");
var protector = dataProtectionProvider.CreateProtector("protect data");
//generate protected payload for input text
encrypted = protector.Protect(inputText);
Console.WriteLine($"protectedPayload:\n{encrypted}\n");
//decrypt protected data
decrypted = protector.Unprotect(encrypted);
Console.WriteLine($"UnprotectPayload:\n{decrypted}\n");
//show verification result
Console.WriteLine($"Verify result:\n{(inputText == decrypted ? true : false)}");
}
catch(Exception ex)
{
Console.WriteLine("Error:", ex);
}
}
}
}
---- 测试代码#2(程序主程序)
namespace ProtectData
{
public class Program
{
static void Main()
{
string testType = "two_step";
RunTest(testType);
Console.WriteLine();
Console.WriteLine("Press any key...");
Console.ReadKey();
}
static void RunTest(string testType)
{
switch ( testType.ToLower())
{
case "simple":
DataProtector.TestProtector();
break;
case "two_step":
string inputData = "DataSource=localhost, database=testdb, userID=appuser, password=topsecret";
Console.WriteLine($"inputData:\n{inputData}\n");
string protectedData = DataProtector.EncryptData(inputData);
Console.WriteLine($"protectedData:\n{protectedData}\n");
string outputData = DataProtector.DecryptData(protectedData);
Console.WriteLine($"outputData:\n{outputData}\n");
bool verify = inputData == outputData;
Console.WriteLine($"verified: {verify}");
break;
}
}
}
}
我正在使用 DataProtectionProvider class 测试配置数据保护。测试代码以一种方式工作,但以另一种方式失败。
测试环境:
应用程序类型:ASP.NET 6 控制台应用程序与 c# 包:Microsoft.AspNetCore.DataProtection.Extensions 6.0.3 IDE:VS 2022 测试项目:ProtectData
问题描述:
在 DataProtector class 中有 3 个方法(参见测试代码 #1)。
TestProtector 方法用于初始测试。它以相同的方法加密和解密数据。没有任何问题
在 EncryptData 和 DecryptData 方法中,该过程分为 2 个独立的步骤。 运行ning用这些方法测试时,异常出现在语句的DecryptData方法:decrypted = protector.Unprotect(encryptedData);异常信息显示在以下屏幕截图中。
测试是 运行 使用 program.main 方法(参见测试代码 $2)
问题:
将“TestProtector”方法中的代码与这两种方法中的代码进行比较时,它们都以相同的方式使用相同的键处理过程。为什么一种方法完美,而“两步法”总是失败?这真的让我很困惑。我将不胜感激任何有关故障排除的帮助或建议。
测试代码
---- 测试代码 #1(使用 DataProtectionProvider 的控制台应用程序)
using Microsoft.AspNetCore.DataProtection;
using System;
namespace ProtectData
{
public static class DataProtector
{
public static string EncryptData(string inputText)
{
string encrypted = string.Empty;
try
{
var dataProtectionProvider = DataProtectionProvider.Create($".\appconfig.txt");
var protector = dataProtectionProvider.CreateProtector("protect data");
//var protectedPayload = protector.Protect(inputText);
encrypted = protector.Protect(inputText);
}
catch (Exception ex)
{
Console.WriteLine("ERROR: " + ex.Message);
}
return encrypted;
}
public static string DecryptData(string encryptedData)
{
string decrypted = string.Empty;
try
{
var dataProtectionProvider = DataProtectionProvider.Create($".\appconfig.txt");
var protector = dataProtectionProvider.CreateProtector("protect conn string");
decrypted = protector.Unprotect(encryptedData);
}
catch(Exception ex)
{
Console.WriteLine("ERROR: " + ex.Message, ex);
}
return decrypted;
}
public static void TestProtector()
{
string inputText = "DataSource=localhost, database=testdb, userID=appuser, password=topsecret";
Console.WriteLine($"inputText:\n{inputText}\n");
string encrypted = string.Empty;
string decrypted = string.Empty;
try
{
// encrypt given string
var dataProtectionProvider = DataProtectionProvider.Create($".\appconfig.txt");
var protector = dataProtectionProvider.CreateProtector("protect data");
//generate protected payload for input text
encrypted = protector.Protect(inputText);
Console.WriteLine($"protectedPayload:\n{encrypted}\n");
//decrypt protected data
decrypted = protector.Unprotect(encrypted);
Console.WriteLine($"UnprotectPayload:\n{decrypted}\n");
//show verification result
Console.WriteLine($"Verify result:\n{(inputText == decrypted ? true : false)}");
}
catch(Exception ex)
{
Console.WriteLine("Error:", ex);
}
}
}
}
---- 测试代码#2(程序主程序)
namespace ProtectData
{
public class Program
{
static void Main()
{
string testType = "two_step";
RunTest(testType);
Console.WriteLine();
Console.WriteLine("Press any key...");
Console.ReadKey();
}
static void RunTest(string testType)
{
switch ( testType.ToLower())
{
case "simple":
DataProtector.TestProtector();
break;
case "two_step":
string inputData = "DataSource=localhost, database=testdb, userID=appuser, password=topsecret";
Console.WriteLine($"inputData:\n{inputData}\n");
string protectedData = DataProtector.EncryptData(inputData);
Console.WriteLine($"protectedData:\n{protectedData}\n");
string outputData = DataProtector.DecryptData(protectedData);
Console.WriteLine($"outputData:\n{outputData}\n");
bool verify = inputData == outputData;
Console.WriteLine($"verified: {verify}");
break;
}
}
}
}