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

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

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

Спасибо!

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Одним из решений будет xor статический пароль с другой константой или даже с другой строкой. Это расширит ваш пароль из-за того, что многие части необходимо объединить, чтобы вернуть их. Строки на скомпилированном двоичном файле не показывают строку 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.)

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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;";
       }
    } 
}