1. Это все хорошо, но, кажется, все, что нужно, это использовать HTTPS. 2. Несмотря на то, что режим GCM очень хорош, он пока не очень хорошо поддерживается, iOS - это основной пример, которому не хватает поддержки GCM.

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

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

Вот мой код

package org;

import java.util.Base64;

public class EncodingString {


    public static void main(String[] args){

    String  str = "I'm Encoding then decoding";

    byte[]   bytesEncoded = Base64.getEncoder().encode(str.getBytes());
    System.out.println(bytesEncoded);
    String EncodedPassword = new String(bytesEncoded);
    System.out.println("ecncoded value is " + EncodedPassword);

    byte[] valueDecoded= Base64.getDecoder().decode(bytesEncoded);
    System.out.println(valueDecoded);
    String DecodedPassword = new String(valueDecoded);
    System.out.println("Decoded value is " + DecodedPassword);


    }

}

Я хочу знать, возможно ли, что я мог бы добавить какой-то пароль к моей зашифрованной строке, чтобы тот же пароль мог использоваться тем, который я хочу декодировать, той же самой строке, отправленной по сети в Java?

 zaph28 окт. 2017 г., 14:03
Jusrt использовать HTTPS, данные будут зашифрованы в пути.
 Nele28 окт. 2017 г., 08:56
@ Рави, да рави, потому что многие знают этот вид шифрования, поэтому мне нужен пароль к этому?
 Ravi28 окт. 2017 г., 08:37
если вы знаете, как вы закодировали, то, очевидно, его легко декодировать.

Ответы на вопрос(1)

кодирование а такжешифрование, Кодирование описывает протокол для представления информации. Вы использовали base64, который кодирует двоичную информацию в подмножество символов ASCII.

Шифрование это то, что вы хотите. Алгоритм шифрования использует ключ (ваш «пароль» с дополнительными требованиями) для манипулирования данными таким образом, что извлечение их без ключа является вычислительно сложным (читай: практически невозможно).

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

// The plaintext to encrypt, and the password we want to use.
String plaintext = "Hello, World!";
String password = "WizardsAreCool";

// Parameters for PBKDF2/AES.  Using a higher iteration count 
// is better in production.
int iterationCount = 25000;
int keySize = 128;
int tagSize = 128;
int saltSize = 16;
int nonceSize = 12;

// We generate a random salt for PBKDF2.
SecureRandom rng = new SecureRandom();
byte[] salt = new byte[saltSize];
rng.nextBytes(salt);

// We derive a 128-bit key using PBKDF2 from the password,
// as AES-128 expects a 128-bit key.  We also use SHA256 instead 
// of SHA1 for the underlying hash.
PBEKeySpec pwSpec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, keySize);
SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] key = keyFac.generateSecret(pwSpec).getEncoded();

// We convert the plaintext to binary and generate a 12-byte nonce for 
// GCM mode.
byte[] rawData = plaintext.getBytes(StandardCharsets.UTF_8);
byte[] nonce = new byte[nonceSize];
rng.nextBytes(nonce);

// We define the cipher.
Cipher aesGcm = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec gcmSpec = new GCMParameterSpec(tagSize, nonce);
aesGcm.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), gcmSpec);

// We get the resulting ciphertext.
byte[] encResult = aesGcm.doFinal(rawData);

// We produce the final result by prepending the PBKDF2 salt and 
// the nonce.
byte[] result = new byte[saltSize + nonceSize + encResult.length];
System.arraycopy(salt, 0, result, 0, saltSize);
System.arraycopy(nonce, 0, result, saltSize, nonceSize);
System.arraycopy(encResult, 0, result, saltSize + nonceSize, encResult.length);

// Print the result as base64.
byte[] b64Result = Base64.getEncoder().encode(result);
System.out.println(new String(b64Result));

// Sample Output
// C100zs91Ku/TbQw4Mgw7e95didsA1Vj5oHGeMitohnRaUGIB08+T6uESro4P2Gf7q/7moMbWTTNT

В приведенном выше коде многое происходит по сравнению с исходным кодом, поэтому я постараюсь объяснить. Используемый нами алгоритм шифрования AES предполагает наличие ключа длиной 128, 192 или 256 бит. Java запрещает использование AES с размером ключа, отличным от 128 бит, по юридическим причинам, поэтому мы вынуждены использовать здесь 128-битный ключ.

Поскольку пароль, который мы хотим использовать («WizardsAreCool»), имеет длину не 128 бит (на самом деле это 14 символов UTF8, а длина 112 бит), мы используем PBKDF2, который являетсяключевая деривационная функция, чтобы получить ключ от нашего пароля длиной 128 бит (отсюдаkeySize будучи 128).

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

AES также принимает несколько параметров. Наиболее важным является ключ. Он также принимает одноразовый номер (поскольку мы находимся в режиме GCM), который также должен быть случайным. Одноразовый номер используется для генерации зашифрованного потока битов из шифра, который затем XOR с нашим открытым текстом.

В целом, приведенный выше пример пригоден для производственного использования и полностью безопасен.

 Nele28 окт. 2017 г., 10:07
Спасибо, Люк, за то, что поделился этим, но не могли бы вы объяснить, каковы параметры для PBKDF2 / AES? Это новое для меня, не могли бы вы, пожалуйста, что они делают и почему они используются?
 Nele28 окт. 2017 г., 10:28
спасибо за хорошее объяснение. Я не получил две вещи. Во-первых, вы говорили о соли, что это такое? Во-вторых, «количество итераций, которое определяет, сколько раз базовый хэш применяется к паролю». ? Я до сих пор не понял, ты имеешь в виду, сколько раз пароль можно было попробовать?
 zaph28 окт. 2017 г., 14:05
1. Это все хорошо, но, кажется, все, что нужно, это использовать HTTPS. 2. Несмотря на то, что режим GCM очень хорош, он пока не очень хорошо поддерживается, iOS - это основной пример, которому не хватает поддержки GCM.
 Luke Joshua Park28 окт. 2017 г., 10:29
@ Неле Я чувствую, что твои знания в этой области могут быть неадекватными для меня, чтобы компетентно объяснить все это тебе. Для вас может быть лучше провести некоторые исследования по этим темам самостоятельно.
 Luke Joshua Park28 окт. 2017 г., 10:15
@Nele Посмотри мои правки, надеюсь, прояснит некоторые вещи. Я стараюсь размещать только тот код, который можно безопасно использовать в производстве, поэтому он несколько сложен.

Ваш ответ на вопрос