Заменить строку из байта [] без преобразования - PullRequest
0 голосов
/ 17 марта 2020

У меня есть byte[], который содержит тело HTTP-запроса. В теле я хочу удалить информацию о пароле перед регистрацией всего тела. Я могу удалить информацию о пароле, если я сначала преобразую byte[] в строку, но, как я знаю, преобразовывать пароль в строку никогда не будет хорошей идеей (поскольку пароль будет храниться в пуле строк, и поэтому он является безопасным беспокойство).

Содержимое byte[] выглядит примерно так (но оно может измениться): body: [{"email":"email@email.com","password":"some_password",.....}]

Так, как я могу удалить часть "password":"some_password" из байта [] без предварительного преобразования в строку?

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Я могу удалить информацию о пароле, если сначала преобразую байт [] в строку.

Я не понимаю, почему вы так думаете. если вы хотите удалить информацию о пароле, просто обновите ячейки byte[], которые содержат символы пароля. Например,

  for (int i = start_of_password; i < end_of_password; i++) {
      bytes[i] = 'X';
  }

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

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

Когда вы создаете Java String из нескольких байтов (или вызывая new String(other_string)), это НЕ помещает результирующую строку в пул строк. Строка, которую вы только что создали, является обычным объектом кучи. Если ваше приложение не хранит ссылку где-либо, оно может довольно быстро получить право на сборку мусора.

Существует только два обстоятельства, когда String входит в пул строк:

  • , когда String соответствует строковому литералу (или «константному выражению») в исходном коде, или

  • , когда что-то явно вызывает intern() в String object.

Еще одна вещь, которую следует учитывать, - почему долгоживущее String в памяти может рассматриваться как проблема безопасности. Проблема в том, что существует риск, что «плохой парень» может получить пароль. Существует несколько потенциальных сценариев ios:

  1. Если кто-то смог скомпрометировать JVM и внедрить в него плохой код (для JVM или уязвимости безопасности приложения), он мог бы извлечь строки. Это было бы действительно трудно достичь, хотя. Требуется много знаний о приложении и среде, в которой оно выполняется. На самом деле, извлечь пароль из byte[] так же просто. В любом случае, исправлением для этого является поддержание вашей JVM в актуальном состоянии и проверка базы кода на наличие явных проблем безопасности, которые могут привести к взлому JVM.

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

  3. Если кто-то сможет получить физический доступ к вашему серверу, он может украсть диски dard и восстановить частичную копию JVM. память из области подкачки. Решение проблемы заключается в обеспечении надлежащей физической безопасности для ваших серверов.

Теперь все эти атаки правдоподобны, но в каждом случае есть либо простое смягчение ... или простое способ победить предосторожность "нет паролей в строках". Я бы посоветовал принять другие меры, прежде чем заняться этим вопросом.

0 голосов
/ 17 марта 2020

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

Вот пример того, как это может выглядеть:

import java.util.ArrayList;

public class MyClass {
    public static void main(String args[]) {
      byte a[] = "body: [{\"email\":\"email@email.com\",\"password\":\"some_password\",.....}]".getBytes();
      byte[] pass = {34,112,97,115,115,119,111,114,100,34,58,34};  //"\"password\":\"".getBytes();
      byte[] end = {34,44}; //"\",".getBytes();
      ArrayList<Byte> arrList= new ArrayList<Byte>();
      boolean foundPassword = false;
      for(int i=0;i<a.length;i++){
        if (a[i] == pass[0] && a[i+1] == pass[1] && a[i+2] == pass[2] && a[i+3] == pass[3] && a[i+4] == pass[4] && a[i+5] == pass[5] && a[i+6] == pass[6] && a[i+7] == pass[7] && a[i+8] == pass[8] && a[i+9] == pass[9] && a[i+10] == pass[10] && a[i+11] == pass[11]){
            i = i+12;
            foundPassword = true;
        } else if (!foundPassword){
            arrList.add(a[i]);
        } else if (foundPassword && a[i] == end[0] && a[i+1] == end[1]){
            arrList.add(new Integer(44).byteValue());
            foundPassword = false;
            i+2;
        }
      }

      byte[] result = new byte[arrList.size()];
      for(int i=0;i<arrList.size();i++)
            result[i] = arrList.get(i);

      System.out.println(new String(result));


    }
}

Вывод: body: [{"email":"email@email.com",,.....}]

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