Как зашифровать данные, чтобы многие пользователи могли их расшифровать? - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть необходимость защитить учетные данные для входа в привилегированную учетную запись таким образом, чтобы к ним можно было обращаться с помощью какого-либо сценария при соответствующих условиях.

Простой ответ может заключаться в том, чтобы зашифровать их в приложении.config, но тогда они могут быть доступны любому пользователю и только на том компьютере, на котором он был зашифрован.Мне нужно распространить эту конфигурацию через Subversion, чтобы исходный код был скомпилирован на любом доступном сервере сборки, и сценарий сборки мог получить доступ к зашифрованным данным.Пользователи сборки будут известны (могут находиться в разных доменах), но машина не всегда будет одинаковой.

Можно ли использовать сертификаты?Без СА?Другой метод?

Предпочел бы сделать это в C #, чтобы его можно было объединить с задачей MSBuild.Я не хочу записывать расшифрованные данные в файловую систему в целях безопасности.

Мысли?

Ответы [ 2 ]

1 голос
/ 02 апреля 2011

Асимметричное шифрование - это то, что вам нужно.

Вот ссылка на документацию MSDN для алгоритма RSA, которая будет работать.

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

}

}

0 голосов
/ 02 апреля 2011

Возможность «распространить» ключ / зашифрованную информацию и предоставить определенным пользователям доступ к ней независимо от компьютера - это почти то же самое, что DRM, и они до сих пор не «решили» эту проблему:)

В любом случае, мне было интересно, может ли это решение подойти вам, ребята?

  1. Настройте список доступа на компьютере, на котором находится зашифрованная информация, и разрешите доступ к нему только серверам сборки.
  2. Теперь, что касается «пользователей», обращающихся к нему, кажется, подразумевается, что одному и тому же пользователю понадобится доступ, но через другую сборочную машину?Если так, то я думаю, что может быть возможно встроить ключ для расшифровки зашифрованной информации для входа в эти учетные записи пользователей, которые должны иметь доступ к этому.Например, в Windows у вас есть управление доступом и вы можете зашифровать информацию об учетных записях пользователей.

Таким образом, в основном это побуждает меня предлагать двойное решение, представляющее собой белый список машин, которые могут получить доступ к этой информации,а пользователи, которым нужно иметь возможность запускать скрипт, могут встроить ключ в свой профиль?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...