Можно ли скрыть пароль, определенный в коде C++

... так что просмотр дизассемблирования не приведет к немедленному раскрытию пароля (объявлен как статическая переменная). В качестве примера представьте себе программу, к которой прикреплен zip-файл, который необходимо открыть для ресурсов, но который не так легко доступен для посторонних глаз.

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

Спасибо!


person SilentDirge    schedule 15.03.2011    source источник
comment
... дизассемблирование не сразу раскрывает пароль (объявленный как статическая переменная) - вы не должны жестко кодировать пароли в своих исполняемых файлах. Это уязвимость безопасности программного обеспечения. См. раздел CWE-798: использование жестко закодированных учетных данных.   -  person jww    schedule 06.10.2014


Ответы (9)


Нет, но есть вещи, которые вы можете сделать, чтобы сделать это сложнее.

Храните пароль в виде набора чисел, выполняйте с ними некоторые вычисления, чтобы сгенерировать фактический пароль, сохраняйте части пароля в таких ресурсах, как значки и т. д.

person Martin Beckett    schedule 15.03.2011
comment
Мне нравится этот. Стеганография с использованием графических ресурсов приложения. - person Tim; 15.03.2011

Если ваша программа является программой Windows, просто используйте «Эта программа не может быть запущена в режиме DOS». как пароль. Эта строка есть почти в каждом исполняемом файле Windows.

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

person Michael Burr    schedule 15.03.2011

Короче нет, Любой взломщик просто поставил бы точку останова на функцию открывающую zip файл, и достал бы там пароль из ОЗУ.

person ninjalj    schedule 15.03.2011

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

http://en.wikipedia.org/wiki/XOR_cipher

person iluwatar    schedule 15.03.2011
comment
+1 ... чтобы сдержать «случайный шпион», это настолько хорошо, насколько вы можете получить, не тратя гораздо больше времени, чем оно того стоит. Как вы сказали, полностью скрыть информацию, которая есть у пользователя на компьютере, совершенно невозможно (если только у программы нет ключа шифрования). - person Damon; 15.03.2011

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

#include <stdio.h>

char pw[8] = {124, 109, 127, 127, 123, 99, 126, 104};

int main(int argc, char** argv) {
  for (int i = 0; i < 8; i++) {
    pw[i] = pw[i] ^ 12;
  }
  printf("%s\n", pw);  // => 'password'
}

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

person Paul Rubel    schedule 15.03.2011

Вы можете заменить пароль другим паролем, полученным из некоторых данных вашей программы, например, относительного положения поля (в упакованной структуре/классе) относительно начала структуры/класса или, возможно, использовать некоторые «постоянные» данные (текущий век и тысячелетие довольно постоянны, для следующих 89 лет :-)) или преобразование некоторых символов из одной кодовой страницы в другую, или, возможно, преобразование некоторых чисел в числа с плавающей запятой или двойные (возможно, даже некоторые простые деления, такие как 2/3, 3/5, 5/7 в двойном значении используются в качестве пароля.Обязательно «заставьте» компилятор не оптимизировать их (возможно, получая число из других «измеримых» вещей, таких как длина некоторых строк)) . Особенно первое, вероятно, легче всего скрыть: довольно часто «измеряют» относительное положение поля. Ни один из этих способов не выдержит 5 минут хакера... Они защитят только от "случайного слежки шестнадцатеричным редактором".

person xanatos    schedule 15.03.2011

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

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

person ultifinitus    schedule 15.03.2011

Покажите пользователю картинку с другим кодом, выделенным курсивом, и вставьте текстовое поле, в которое пользователь может ввести код, написанный на картинке. XOR пароль ZIP-файла с кодом на картинке. Результат может быть реализован жестко. Программа должна XOR жестко запрограммированного кода с вводом пользователя, чтобы получить код ZIP-файла. При желании вы можете проверить введенный код, используя другой односторонний код.

person Van Uitkon    schedule 07.03.2015

запутать пароль с помощью perl-скрипта. Хакеры все еще могут реконструировать ваш машинный код... но, по крайней мере, ваш пароль не очевиден из шестнадцатеричного редактора.

obfuscate_password("my_password434");

sub obfuscate_password($) {

  my $string = shift;
  my @c = split(//, $string);
  push(@c, "skip"); # Skip Null Terminator
                    # using memset to clear this byte
  # Add Decoy Characters
  for($i=0; $i < 100; $i++) {
    $ch = rand(255);
    next if ($ch == 0);
    push(@c, chr($ch));
  }                     
  my $count1 = @c;
  print "  int x1, x2, x3, x4, x5;\n";
  print "  char password[$count1];\n";
  print "  memset(password, 0, $count1);\n";
  my $count2 = 0;
  my %dict  = ();
  while(1) {
    my $x = int(rand($count1));
    $y = obfuscate_expr($count1, $x);
    next if (defined($dict{$x}));
    $dict{$x} = 1;
    last if ($count2+1 == $count1);
    if ($c[$x] ne "skip") {
      #print "  $y\n";
      print "  $y password[x4] = (char)" . ord($c[$x]) . ";\n";
    }
    $count2++;
  }
}

sub obfuscate_expr($$) {
    my $count  = shift;
    my $target = shift;
    #return $target;

    while(1) {

       my $a = int(rand($count*2));
       my $b = int(rand($count*2));
       my $c = int(rand($count*2));
       next if (($a == 0) || ($b == 0) || ($c == 0));
       my $y = $a - $b;
       #print "$target: $y : $a - $b\n";
       if ($y == $target) {
          #return "$a - $b + $c";
          return "x1=$a; x2=$b; x3=$c; x4=x1-x2+x3; x5= +=x4;";
       }
    } 
}
person Bill    schedule 28.03.2016