Устройство хранения данных пароля в управлении исходным кодом

Никто не предоставил « классическое решение Reflection », так что вот полный пример кода:

using System;
using System.Collections;
using System.Collections.Generic;

namespace DictionaryRuntime
{
    public class DynamicDictionaryFactory
    {
        /// <summary>
        /// Factory to create dynamically a generic Dictionary.
        /// </summary>
        public IDictionary CreateDynamicGenericInstance(Type keyType, Type valueType)
        {
            //Creating the Dictionary.
            Type typeDict = typeof(Dictionary<,>);

            //Creating KeyValue Type for Dictionary.
            Type[] typeArgs = { keyType, valueType };

            //Passing the Type and create Dictionary Type.
            Type genericType = typeDict.MakeGenericType(typeArgs);

            //Creating Instance for Dictionary<K,T>.
            IDictionary d = Activator.CreateInstance(genericType) as IDictionary;

            return d;

        }
    }
}

Выше DynamicDictionaryFactory класс имеет метод

CreateDynamicGenericInstance(Type keyType, Type valueType)

, и он создает и возвращает экземпляр IDictionary, типы ключей и значений которых точно указаны в запросе keyType и valueType.

Вот полный пример того, как вызвать этот метод для создания экземпляра и использования Dictionary<String, int>:

using System;
using System.Collections.Generic;

namespace DynamicDictionary
{
    class Test
    {
        static void Main(string[] args)
        {
            var factory = new DictionaryRuntime.DynamicDictionaryFactory();
            var dict = factory.CreateDynamicGenericInstance(typeof(String), typeof(int));

            var typedDict = dict as Dictionary<String, int>;

            if (typedDict != null)
            {
                Console.WriteLine("Dictionary<String, int>");

                typedDict.Add("One", 1);
                typedDict.Add("Two", 2);
                typedDict.Add("Three", 3);

                foreach(var kvp in typedDict)
                {
                    Console.WriteLine("\"" + kvp.Key + "\": " + kvp.Value);
                }
            }
            else
                Console.WriteLine("null");
        }
    }
}

. Когда указанное консольное приложение выполняется, мы получаем правильный ожидаемый результат:

Dictionary<String, int>
"One": 1
"Two": 2
"Three": 3
19
задан Marcus Leon 18 February 2009 в 02:21
поделиться

6 ответов

Если Ваш план состоит в том, чтобы сохранить весь код и конфигурационную информацию для выполнения производственной системы непосредственно от управления версиями, и без человеческого вмешательства, Вы завинчены. Почему? Это - все просто, что нарушение старой аксиомы безопасности "никогда не записывает Ваш пароль". Давайте сделаем доказательство отрицанием.

Первое сокращение, у Вас есть незашифрованные пароли в конфигурационных файлах. Это бесполезно, они могут быть считаны любым, кто видит файлы.

113-секундное сокращение, мы зашифруем пароли! Но теперь код должен знать, как дешифровать пароли, таким образом, необходимо поместить ключ расшифровки где-нибудь в код. Проблема была просто снижена уровень.

Как насчет того, чтобы использовать общественность/закрытые ключи? Та же проблема как пароли, ключ должен быть в коде.

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

, Который приносит нам к тому, почему помещение паролей на диске является плохой идеей. Это нарушает понятие брандмауэра безопасности. Одна поставленная под угрозу машина, содержащая данные для входа, означает, что другие машины будут поставлены под угрозу. Одна плохо сохраняемая машина может разъединить Вашу целую организацию.

В какой-то момент человек оказывается перед необходимостью вводить критический секрет для запуска цепочки доверительного движения. То, что Вы могли сделать, шифруют все секреты в коде и затем когда система запускает, имеют человека, вручную вводят ключ для дешифрования всех паролей. Это похоже на системное использование Firefox основного пароля. Это открыто для злоупотребления с тех пор, после того как тот один пароль поставлен под угрозу, много систем могут быть поставлены под угрозу, но это удобно и вероятно более безопасно, так как пользователи только должны помнить один пароль и, менее вероятно, запишут его.

последний штрих состоит в том, чтобы гарантировать, чтобы это было должно данные для входа быть поставленным под угрозу (и необходимо всегда предполагать, что это будет), что A) взломщик не может сделать многого с ним и B) можно быстро закрыть поставленные под угрозу учетные записи. Бывшие средства только сделать отчеты столько доступа, сколько им нужно. Например, если Ваша программа только когда-либо должна читать из базы данных, имеют его, входят в систему на учетной записи, ограниченной ВЫБОРОМ. В целом удалите весь доступ и затем добавьте его только по мере необходимости. Будьте скупы о правах удалить, чтобы Вы не получаете посещение от небольшие Таблицы .

Bobby

последние средства, Вы даете каждому пользователю/организации/проекту их собственный вход в систему, даже если они могут иметь те же самые права и полномочия и получить доступ к тем же данным. Это - немного больше стычки, но это означает, что, если одна система поставлена под угрозу, можно быстро закрыть ту учетную запись, не закрывая целый бизнес.

21
ответ дан 30 November 2019 в 05:11
поделиться

Я предполагаю, что цель состоит в том, что Вы не хотите, чтобы частные пароли Вашей компании были доступны, зашифрованными, дешифрованные, или иначе, никому, которому нужно иначе разрешить доступ к остальной части источника.

Вот то, как я делаю это. Я копировал этот шаблон от TikiWiki, который делает это также.

в некотором файле, который обычно содержит пароли, устанавливает их на фиктивные значения, не имеет значения что. Установите его на то, что должен видеть Ваш клиент. Поместите комментарий поблизости, чтобы разработчики оставили этот файл в покое, и измените второй файл.

Во втором файле, который создается, если это не там, помещает фактические пароли. примите меры, чтобы этот файл был включен, импортирован, безотносительно, первым файлом.

Принимают меры, чтобы Ваше управление исходным кодом проигнорировало тот файл. Мог выглядеть примерно так:

# in .gitignore
localsettings.py

# in settings.py
## Alter this value to log into the snack machine:
## developers: DON'T alter this, instead alter 'localsettings.py'
SECRET_VALUE = ""
try:
  from localsettings import *
except:
  pass

# in localsettings.py
SECRET_VALUE = "vi>emacs"
6
ответ дан 30 November 2019 в 05:11
поделиться

Вы не упоминали язык, таким образом, вот решение vb.net, которое мы используем:

Imports System.Web.Security
Imports System.Security.Cryptography
Imports System.Text
Imports Microsoft.Win32

Public Class myCrypt

Private myKey As String = "somekeyhere"
Private cryptDES3 As New TripleDESCryptoServiceProvider()
Private cryptMD5Hash As New MD5CryptoServiceProvider()


Private Function Decrypt(ByVal myString As String) As String
    cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey))
    cryptDES3.Mode = CipherMode.ECB
    Dim desdencrypt As ICryptoTransform = cryptDES3.CreateDecryptor()
    Dim buff() As Byte = Convert.FromBase64String(myString)
    Decrypt = ASCIIEncoding.ASCII.GetString(desdencrypt.TransformFinalBlock(buff, 0, buff.Length))
End Function

Private Function Encrypt(ByVal myString As String) As String
    cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey))
    cryptDES3.Mode = CipherMode.ECB
    Dim desdencrypt As ICryptoTransform = cryptDES3.CreateEncryptor()
    Dim MyASCIIEncoding = New ASCIIEncoding()
    Dim buff() As Byte = ASCIIEncoding.ASCII.GetBytes(myString)
    Encrypt = Convert.ToBase64String(desdencrypt.TransformFinalBlock(buff, 0, buff.Length))
End Function

End Class
-1
ответ дан 30 November 2019 в 05:11
поделиться

Я создал системы, где база данных пары userid/password не является частью отбрасывания кода. Ключ должен установить сайт-специфичный механизм конфигурации. Затем можно поместить такую информацию о рассматриваемом поле без него являющийся частью кодовой базы.

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

1
ответ дан 30 November 2019 в 05:11
поделиться

При выполнении в C Вы могли сохранить в как массив символов и вставить символы как десятичные ссылки. Не уверенный, если это повредит строки или нет, но могло бы помочь облегчить часть той проблемы.

char pass[]={72, 101, 108, 108, 111};
-9
ответ дан 30 November 2019 в 05:11
поделиться

Пароли хранилища в зашифрованном виде. Запишите пользовательскую стандартную программу, которая дешифрует пароли и обновляет конфигурационные файлы во время изготовления. Это может быть легко интегрировано с инструментом сборки как Муравей.

-5
ответ дан 30 November 2019 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: