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