Совместимость AES между .NET и iPhone?

Используйте обратный прокси nginx:

  1. установите Nginx на хост. В Debian / Ubuntu: apt-get install nginx. Примечание. Я предположил, что у вас уже нет apache или другого веб-сервера на хосте ...
  2. Для каждого сайта напишите файл сайта nginx в каталоге /etc/nginx/sites-available, который перенаправляет этот сайт на http-сайт докер-контейнера, который будет работать на каком-то другом заранее установленном порту (например, 2001, 2002, ...). Каждый сайт получает свой собственный файл, как тот, который приведен ниже, но с разными заранее подготовленными портами для каждого сайта. Внешние пользователи получат доступ к ним на порту 80 того же IP-адреса, но с разными именами веб-сайтов, и из этих имен nginx будет обрабатывать необходимые внутренние подключения незаметно.
  3. символизирует файлы сайта, чтобы они отображались в каталоге /etc/nginx/sites-enabled и перезапускали nginx. Позже вы можете удалить одну из этих ссылок и перезапустить nginx, если вам нужно временно отключить доступ к сайту.
  4. запустите контейнеры при перезапуске системы, добавив команды docker run в /etc/rc.local и перенаправляя предварительно назначенный порт хоста (localhost: 2001) в контейнерный порт 80, например docker run -d -p localhost:2001:80 imageA

Если контейнер упал, вы получите ошибку шлюза от nginx. Это может быть настроено для показа пользовательской HTML-страницы. Для большей надежности лучше управлять контейнерами в supervisord или другом диспетчере процессов, который обновляет мертвые процессы.

Вот пример файла сайта nginx для перенаправления на порт 2001:

upstream dockerA { 
         server localhost:2001;
}

server {
       listen 192.168.1.8:80;  // REPLACE WITH HOST NUMERIC IP ADDRESS
       root /var/web/siteAstaticfiles;
       index index.html;
       server_name www.siteA.com;

       location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;
                proxy_pass http://dockerA;
        }               
}

В этом примере, хотя локальный каталог диска для файлов HTML настроен для сайта A, он не используется. Вместо этого все запросы отправляются вверх по течению. Я не проверял, можно ли безопасно пропустить строки root и index.

22
задан David Veksler 12 February 2009 в 20:28
поделиться

2 ответа

По крайней мере Вы используете отличающиеся векторы инициализации (IV).

  • код .NET использует ключ для IV.

    private static AesCryptoServiceProvider GetProvider(byte[] key)
    {
        //Set up the encryption objects
        AesCryptoServiceProvider result = new AesCryptoServiceProvider();
        byte[] RealKey = Encryptor.GetKey(key, result);
        result.Key = RealKey;
        result.IV = RealKey;
        return result;
    }

    и

    private static byte[] GetKey(byte[] suggestedKey, AesCryptoServiceProvider p)
    {
        byte[] kRaw = suggestedKey;
        List kList = new List();
        for (int i = 0; i < p.LegalKeySizes[0].MinSize; i += 8 )
        {
            kList.Add(kRaw[i % kRaw.Length]);
        }
        byte[] k = kList.ToArray();
        return k;
    }

    , который должен, вероятно, быть: kList.Add(kRaw[(i / 8) % kRaw.Length]);. Иначе ключ, % длины которого 8 == 0 будет неоднократно использовать ту же букву, doh!

    Таким образом IV (и ключ) используемый .NET: hleolhleolhleolh. Это не часть API, а скорее из-за кода обертки, на который Вы указали (который имеет серьезную ошибку в нем...).

  • код iPhone использует 0 для IV.

    // Initialization vector; dummy in this case 0's.
    uint8_t iv[kChosenCipherBlockSize];
    memset((void *) iv, 0x0, (size_t) sizeof(iv));
  • , openssl по умолчанию предварительно ожидает случайным образом сгенерированную соль (который является, почему вывод дольше!).

вывод openssl более безопасен, так как он предварительно ожидает случайный вектор инициализации. Это похоже на первые несколько байтов base64, декодируемая строка "Посолилась __". Можно также попросить, чтобы openssl не использовал соль (-nosalt) и / или обеспечил IV (-iv).

По существу, openssl, .NET и iPhone используют то же шифрование, просто необходимо быть осторожными, как Вы инициализируете API с ключом шифрования и вектором инициализации.

16
ответ дан johnny 29 November 2019 в 05:40
поделиться

Вы уверены, что используете тот же ключ AES в Ваших тестах? Пример OpenSSL в Вашем сообщении использует пароль, который OpenSSL получает ключ и IV от (и вероятно использует соль также.

Генерируют случайный 128-разрядный ключ и указывают этот ключ в шестнадцатеричном формате к OpenSSL с:

openssl enc -aes-128-cbc -a -in hello.txt -K KEY_IN_HEX -iv 0

Вы не должны использовать IV=0 ни в какой защищенной системе, но для тестирования совместимости, это в порядке.

2
ответ дан Anders Westrup 29 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

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