Как запретить пользователю читать строки, хранящиеся в двоичном файле? - PullRequest
4 голосов
/ 11 марта 2012

Вот минимальный тестовый пример:

#include <stdio.h>
#include <stdlib.h>

int main ( int argc , char **argv )
{
        const char abc [15] = "abcdefg\0";
        printf ("%s\n" , abc);
        return 0;
}

И вы делаете strings test, вы должны увидеть abcdefg, так как он хранится в области только для чтения.

Итак, как лучше всего запретить пользователю читать эту строку с помощью команды "strings", например, я не хочу, чтобы пользователи знали мою фразу SQL

Ответы [ 3 ]

11 голосов
/ 11 марта 2012

Одним из решений было бы написать дополнительную программу, которая запускается от имени другого пользователя , и считывать учетные данные из места, где они недоступны пользователям, от которых вы хотите защитить учетные данные.Эта программа будет предоставлять API (через TCP / IP или любой интерфейс передачи сообщений или удаленный вызов процедур), который не требует прямого подключения к базе данных, но отвечает только на интересующие вас запросы.

Другойподход состоит в том, чтобы установить бит setuid в вашей программе и считывать учетные данные из места, где пользователи не имеют доступа для чтения.Дайте программе владельца, которому разрешено читать файл, содержащий запрос, используя chown.При выполнении ваша программа получит права на чтение файла.

Как и сказано в ответе Наваза (и Биньямина Шарета), вы можете использовать методы запутывания, чтобы затруднить чтение запроса (в частности, он не будетработать с strings больше), но имейте в виду, что кто-то с большими знаниями сможет найти строку, используя деассемблер или отладчик, или просто запустив вашу программу в strace.Это делает такой подход непригодным для хранения конфиденциальной информации , например, учетных данных для подключения: если бинарный файл может подключаться, он содержит учетные данные, все, кто обладает знаниями в области компьютерной безопасности, знают это и могут перепроектировать вашу программу для полученияпароль.

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

4 голосов
/ 11 марта 2012

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

Например, строка "привет", XORed с 0x55:

hello:  0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x00
0x55:   0x55, 0x55, 0x55, 0x55, 0x55, 0x55
result: 0x3D, 0x30, 0x39, 0x39, 0x3A, 0x55

Итак, мы храним буфер:

char enc_str[] = { 0x3D, 0x30, 0x39, 0x39, 0x3A, 0x55 };

Это наша функция дешифрования (упрощенная):

#define DEC_STR(X, Y) getDecryptedStr(X, Y sizeof(Y))
void getDecryptedStr(char * dec_str, char * enc_str, size_t size) {
    int i;
    for (i = 0; i < size; ++i) {
        dec_str[i] = enc_str[i] ^ 0x55;
    }
}

И вот как мы это используем:

char clear_str[sizeof(enc_str)];
DEC_STR(clear_str, enc_str);
1 голос
/ 11 марта 2012

В зависимости от ваших требований и возможностей, вы можете сделать следующее:

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

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

...