Как я могу указать локальный адрес на java.net. URLConnection?

Jozef прав.

Когда вы создаете шифр с параметрами по умолчанию, по умолчанию он имеет значение «RSA / ECB / PKCS1Padding». Вы должны явно указать заполнение, если вам не нравятся неприятные сюрпризы. Потому что другие поставщики безопасности могут иметь разные параметры по умолчанию. И вы никогда не знаете заранее, какие настройки безопасности имеют каждая конкретная JRE.

Таким образом, дополнение PKCS1 добавляет 11 байт к вашим исходным данным, увеличивая его с 117 байт до 128 байтов. Вы должны учитывать, что эти номера относятся к 1024-битным RSA-ключам (которые незначительно защищены) и будут отличаться для более длинных ключей. Поскольку вы загружаете ключ из файла, проверьте его длину.

@Test
public void testPadding() throws Exception {
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    keyGen.initialize(1024, random);
    KeyPair keyPair = keyGen.generateKeyPair();

    /* constant 117 is a public key size - 11 */
    byte[] plaintext = new byte[117];
    random.nextBytes(plaintext);

    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
    byte[] ciphertext = cipher.doFinal(plaintext);
    System.out.println(plaintext.length + " becomes " + ciphertext.length);
}

Это выводит

117 becomes 128

И, наконец, рассмотрите возможность использования AES вместо RSA для шифрования файлов.

Итак, чтобы исправить проблему, вам необходимо использовать буфер размером с открытым ключом - 11 (117) для шифрования и размера открытого ключа (128) для дешифрования.

Изменить

outputFile.write(cipher.doFinal(buffer), 0, read);

-

outputFile.write(cipher.doFinal(buffer));

, поскольку чтение буфера составляет 117 байт, а размер doFinal - 128 байт.

Также вам необходимо буферизовать входные потоки. Когда вы читаете файл, это может быть медленным, а затем InputStream будет читать меньше данных, чем может содержать буфер. С помощью BufferedInputStream обеспечивается достаточное количество данных до того, как будет возвращен вызов чтения. Однако для дешифрования крайне важно иметь полный блок данных

InputStream inputEntry = new BufferedInputStream(originalZipFile.getInputStream(entry));
11
задан til 2 September 2017 в 15:44
поделиться

3 ответа

Это должно добиться цели:

URL url = new URL(yourUrlHere);
Proxy proxy = new Proxy(Proxy.Type.DIRECT, 
    new InetSocketAddress( 
        InetAddress.getByAddress(
            new byte[]{your, ip, interface, here}), yourTcpPortHere));
URLConnection conn = url.openConnection(proxy);

И Вы сделаны. Не забывайте обрабатывать исключения приятно, и от курса изменяют значения для удовлетворения сценарию.

А-ч и я опустили операторов импорта

6
ответ дан 3 December 2019 в 09:42
поделиться

Используя свободное городское население Apache HttpClient я также нашел, что следующее работает (удаленная попытка/выгода ясности):

HostConfiguration hostConfiguration = new HostConfiguration();
byte b[] = new byte[4];
b[0] = new Integer(192).byteValue();
b[1] = new Integer(168).byteValue();
b[2] = new Integer(1).byteValue();
b[3] = new Integer(11).byteValue();

hostConfiguration.setLocalAddress(InetAddress.getByAddress(b));

HttpClient client = new HttpClient();
client.setHostConfiguration(hostConfiguration);
GetMethod method = new GetMethod("http://remoteserver/");
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
    new DefaultHttpMethodRetryHandler(3, false));
int statusCode = client.executeMethod(method);

if (statusCode != HttpStatus.SC_OK) {
    System.err.println("Method failed: " + method.getStatusLine());
}

byte[] responseBody = method.getResponseBody();
System.out.println(new String(responseBody));");

Однако я все еще задаюсь вопросом, что произошло бы, если шлюз IP снижается (192.168.1.11 в этом случае). Следующий шлюз попробуют, или он перестанет работать?

3
ответ дан 3 December 2019 в 09:42
поделиться

Очевидный портативный путь состоял бы в том, чтобы установить Прокси в URL.openConnection. Прокси может быть в локальном хосте, можно затем записать очень простой прокси, который связывает локальный адрес клиентского сокета.

Если Вы не можете изменить источник, где URL соединен, можно заменить URLStreamHandler или при вызове конструктора URL или глобально через URL.setURLStreamHandlerFactory. URLStreamHandler может затем делегировать к значению по умолчанию http/https обработчик, изменив вызов openConnection.

Более экстремальный метод должен был бы полностью заменить обработчик (возможно, расширяющий реализацию в Вашем JRE). С другой стороны, альтернативный (открытый исходный код) http клиенты доступен.

1
ответ дан 3 December 2019 в 09:42
поделиться
Другие вопросы по тегам:

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