Как можно хранить данные в памяти относительно безопасно? К примеру, мне надо хранить ключ, на нем будет расшифровываться данные от сервера. Как защитить эту область памяти от чужого чтения?
можно перемешать ключ с мусором, но желательно, что бы энтропия полученных данных низкая получилась. защитить память почти не реально.
Дык ты же сам будешь ключ модифицировать, вот и позаботься, что бы можно было и обратное преобразование выполнить
см. MSDN на предмет этих функций. CryptProtectMemory CryptUnprotectMemory RtlEncryptMemory RtlDecryptMemory
S_T_A_S_ в общем этот метод ничуть не хуже того что ты предложил Ну разве что бряки будут поставлены на 15 минут раньше ) Кроме того, это (AFAIK) единственный документированный метод криптографической защиты области памяти.
В принципе мне достаточно чтоб из сети не дернули данные т.к. пишу клиента (сервак есть) с защищеным обменом (ГОСТ + RSA).
SnugForce В этом случае все упирается в защищенность машины в сети. Во всяком случае если кому-либо удастся получить к ней удаленный доступ, защита памяти процесса, будет практически бесполезной.
flankerx Я предполагаю, что ключи ищутся примерно таким способом: запускается драйвер, который сканирует физическую память и файл подкачки. Фактически поиск по высокой энтропии + проверка. Есть ещё полумифические способы поиска ключей RSA по каким-то там свойствам. За что ещё зацепиться не изучив как следует прогу? Если же есть вызовы API, то они говорят: "вот оно, копай здесь"
SnugForce Так если сервак твой, сделай challenge-response authentication как у всех других, каждый сеанс новый(случайный) пароль, то что из сети дернут будет пошифровано, а на компе надо разграничивать доступ по правам (клиент под админом, все остальное без) чтоб драйвер не запустили
S_T_A_S_ Я делал такую прожку, сканировала оперативу (из юзера под админом) по сигнатуре RSA2(0x31415352) и PRIVATEKEYBLOB(0x07), ключи то находит, но проблема связать какой от чего
S_T_A_S_ я убежден что если твоя программа работает под отладчиком, то её уже ничто не спасет, и никаких секретов она не сохранит А ключи в общем-то можно и не хранить а вычислять каждый раз при вызове функции зашифрования/расшифрования. Ну кроме того высокую энтропию имеют не только ключи но и, например, зашифрованные данные. А по-моему эти ключи проще всего искат по сигнатрам типа "RSA.1" и "RSA.2"
bogrus > Можно попробовать все найденые, это же быстрее чем факторизовать flankerx > Это верно, но от lunchtime attack защититься можно.
Кстати хотелось все проверить, да руки не дошли - если обьявить дескриптор сегмента с базой 0xFFFFF000, и пределом 128 мб, можно ли будет адресоватся по смещению в этом сегменте >= 0x1000 (т.е. с сверткой 32-битного адреса), или доступно будет только 4095 байт всего?
Кстати CryptProtectMemory работает только в Windows Server 2003, вспомнил что там не получалось открыть \\.\PhysicalMemory даже под админом, что говорит в пользу выбора его сервером
Как я вижу общение клиента с клиентом через сервер: А и В подкл к серверу. Каждый отправляет свой открытый ключ RSA Если А хочет общаться в привате с В, то А запрашивает сервер ключ В и на нем шифрует ГОСТ-ключ и передает через сервер. Но сервер уже под напрягом (если его ломают, то все новые приваты можно открыть). Делать-то чего?