如何加密数据以便许多用户可以解密它?

时间:2011-04-01 19:44:39

标签: .net encryption

我需要保护特权帐户的登录凭据,以便在适当的条件下通过某种脚本访问它们。

简单的答案可能是在app.config中加密它们,但是任何用户都可以访问它们,并且只能在加密的机器上访问它们。我需要通过Subversion分发这个配置,以便在任何可用的构建服务器上编译源代码,构建脚本可以访问加密数据。构建用户将是已知的(可能在不同的域上),但每次都不会是相同的。

可以使用证书吗?没有CA?另一种方法?

更喜欢在C#中执行此操作,以便可以将其耦合到MSBuild任务中。我不想将解密数据写入文件系统以保证安全。

思想?

2 个答案:

答案 0 :(得分:1)

不需要非对称加密。

这是RSA算法的MSDN文档链接,可以使用。

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx

这是他们在页面底部提供的示例。

static void Main()
{
    try
    {
        //Create a UnicodeEncoder to convert between byte array and string.
        UnicodeEncoding ByteConverter = new UnicodeEncoding();

        //Create byte arrays to hold original, encrypted, and decrypted data.
        byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt");
        byte[] encryptedData;
        byte[] decryptedData;

        //Create a new instance of RSACryptoServiceProvider to generate
        //public and private key data.
        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
        {

            //Pass the data to ENCRYPT, the public key information 
            //(using RSACryptoServiceProvider.ExportParameters(false),
            //and a boolean flag specifying no OAEP padding.
            encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);

            //Pass the data to DECRYPT, the private key information 
            //(using RSACryptoServiceProvider.ExportParameters(true),
            //and a boolean flag specifying no OAEP padding.
            decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);

            //Display the decrypted plaintext to the console. 
            Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData));
        }
    }
    catch (ArgumentNullException)
    {
        //Catch this exception in case the encryption did
        //not succeed.
        Console.WriteLine("Encryption failed.");

    }
}

static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
    try
    {
        byte[] encryptedData;
        //Create a new instance of RSACryptoServiceProvider.
        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
        {

            //Import the RSA Key information. This only needs
            //toinclude the public key information.
            RSA.ImportParameters(RSAKeyInfo);

            //Encrypt the passed byte array and specify OAEP padding.  
            //OAEP padding is only available on Microsoft Windows XP or
            //later.  
            encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
        }
        return encryptedData;
    }
    //Catch and display a CryptographicException  
    //to the console.
    catch (CryptographicException e)
    {
        Console.WriteLine(e.Message);

        return null;
    }

}

static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
    try
    {
        byte[] decryptedData;
        //Create a new instance of RSACryptoServiceProvider.
        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
        {
            //Import the RSA Key information. This needs
            //to include the private key information.
            RSA.ImportParameters(RSAKeyInfo);

            //Decrypt the passed byte array and specify OAEP padding.  
            //OAEP padding is only available on Microsoft Windows XP or
            //later.  
            decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
        }
        return decryptedData;
    }
    //Catch and display a CryptographicException  
    //to the console.
    catch (CryptographicException e)
    {
        Console.WriteLine(e.ToString());

        return null;
    }

}

}

答案 1 :(得分:0)

能够“分发”密钥/加密信息并允许某些用户无论使用何种机器访问此信息的步骤与DRM几乎完全相同,他们仍然没有“解决”这个问题:)

无论如何,我想知道这个解决方案是否对你们有用?

  1. 在计算机上设置加密信息所在的访问列表,并且只允许构建服务器访问它。
  2. 现在关于访问它的“用户”,似乎暗示同一个用户需要访问但是通过不同的构建机器?如果是这样,那么我认为可以嵌入密钥来解密这些应该有权访问的用户帐户中的加密登录信息。例如,对于Windows,您具有访问管理功能,可以加密用户帐户信息。
  3. 所以基本上这会让我建议一个双叉解决方案,它是一个白名单,列出哪些机器可以访问这些信息,而需要能够运行脚本的用户可以将密钥嵌入到他们的个人资料中?