protectedData 问题 API
Issues with protectedData API
我有以下代码,应用程序有时会成功运行,但对于某些用户来说,它无法解密密码。它主要发生在服务器和多用户环境中,在开发机器上运行良好。
public static byte [] Protect( byte [] data )
{
try
{
// Encrypt the data using DataProtectionScope.CurrentUser. The result can be decrypted
// only by the same current user.
return ProtectedData.Protect( data, s_aditionalEntropy, DataProtectionScope.CurrentUser );
}
catch (CryptographicException e)
{
Console.WriteLine("Data was not encrypted. An error occurred.");
Console.WriteLine(e.ToString());
return null;
}
}
public static byte [] Unprotect( byte [] data )
{
try
{
//Decrypt the data using DataProtectionScope.CurrentUser.
return ProtectedData.Unprotect( data, s_aditionalEntropy, DataProtectionScope.CurrentUser );
}
catch (CryptographicException e)
{
Console.WriteLine("Data was not decrypted. An error occurred.");
Console.WriteLine(e.ToString());
return null;
}
}
在服务器端上下文中,您在使用它时遇到一些问题。查看详情:
CurrentUser 范围:受保护的数据与 CurrentUser 相关联,我的意思是,只有加密数据的用户才能解密它 - 没有其他人。你可能会把它理解为保护个人数据的例程。
LocalMachine Scope:如前所述,它允许不同的用户解密数据,但可能会导致安全问题!使用此范围,即使不在同一 group/domain 中的用户也能解密数据!控制不在加密例程上,而是在对服务器的用户访问中。
如果您有 public(或不在域下)服务器并且需要一些人访问某些类型的数据,您可以放弃 DataProtectionScope 并尝试自定义过程,其中:
1 - 您检查用户是否获得授权。
2 - 您提供加密和解密数据的机制。
3 - 您可以为不同的用户或组假设不同的密钥。
详情请考虑看这个link:
https://msdn.microsoft.com/en-us/library/system.security.cryptography.dataprotectionscope(v=vs.110).aspx
DataProtectionScope.LocalMachine: 这个作用域可以解密系统中任何经过身份验证的用户。
DataProtectionScope.CurrentUser :此范围仅对身份用于加密的用户有效,只有该身份才能使其解密。
public static byte [] Protect( byte [] data )
{
try
{
return ProtectedData.Protect( data, s_aditionalEntropy, DataProtectionScope.LocalMachine );
}
catch (CryptographicException e)
{
Console.WriteLine("Data was not encrypted. An error occurred.");
Console.WriteLine(e.ToString());
return null;
}
}
public static byte [] Unprotect( byte [] data )
{
try
{
return ProtectedData.Unprotect( data, s_aditionalEntropy, DataProtectionScope.LocalMachine );
}
catch (CryptographicException e)
{
Console.WriteLine("Data was not decrypted. An error occurred.");
Console.WriteLine(e.ToString());
return null;
}
}
我有以下代码,应用程序有时会成功运行,但对于某些用户来说,它无法解密密码。它主要发生在服务器和多用户环境中,在开发机器上运行良好。
public static byte [] Protect( byte [] data )
{
try
{
// Encrypt the data using DataProtectionScope.CurrentUser. The result can be decrypted
// only by the same current user.
return ProtectedData.Protect( data, s_aditionalEntropy, DataProtectionScope.CurrentUser );
}
catch (CryptographicException e)
{
Console.WriteLine("Data was not encrypted. An error occurred.");
Console.WriteLine(e.ToString());
return null;
}
}
public static byte [] Unprotect( byte [] data )
{
try
{
//Decrypt the data using DataProtectionScope.CurrentUser.
return ProtectedData.Unprotect( data, s_aditionalEntropy, DataProtectionScope.CurrentUser );
}
catch (CryptographicException e)
{
Console.WriteLine("Data was not decrypted. An error occurred.");
Console.WriteLine(e.ToString());
return null;
}
}
在服务器端上下文中,您在使用它时遇到一些问题。查看详情:
CurrentUser 范围:受保护的数据与 CurrentUser 相关联,我的意思是,只有加密数据的用户才能解密它 - 没有其他人。你可能会把它理解为保护个人数据的例程。
LocalMachine Scope:如前所述,它允许不同的用户解密数据,但可能会导致安全问题!使用此范围,即使不在同一 group/domain 中的用户也能解密数据!控制不在加密例程上,而是在对服务器的用户访问中。
如果您有 public(或不在域下)服务器并且需要一些人访问某些类型的数据,您可以放弃 DataProtectionScope 并尝试自定义过程,其中:
1 - 您检查用户是否获得授权。 2 - 您提供加密和解密数据的机制。 3 - 您可以为不同的用户或组假设不同的密钥。
详情请考虑看这个link: https://msdn.microsoft.com/en-us/library/system.security.cryptography.dataprotectionscope(v=vs.110).aspx
DataProtectionScope.LocalMachine: 这个作用域可以解密系统中任何经过身份验证的用户。
DataProtectionScope.CurrentUser :此范围仅对身份用于加密的用户有效,只有该身份才能使其解密。
public static byte [] Protect( byte [] data )
{
try
{
return ProtectedData.Protect( data, s_aditionalEntropy, DataProtectionScope.LocalMachine );
}
catch (CryptographicException e)
{
Console.WriteLine("Data was not encrypted. An error occurred.");
Console.WriteLine(e.ToString());
return null;
}
}
public static byte [] Unprotect( byte [] data )
{
try
{
return ProtectedData.Unprotect( data, s_aditionalEntropy, DataProtectionScope.LocalMachine );
}
catch (CryptographicException e)
{
Console.WriteLine("Data was not decrypted. An error occurred.");
Console.WriteLine(e.ToString());
return null;
}
}