Muszę przechowywać poufne informacje (symetryczny klucz szyfrowania, który chcę zachować dla siebie) w mojej aplikacji C ++. Prostym podejściem jest zrobienie tego:
std::string myKey = "mysupersupersecretpasswordthatyouwillneverguess";
Jednak uruchomienie aplikacji przez strings
proces (lub inny, który wyodrębnia ciągi z aplikacji binarnej) ujawni powyższy ciąg.
Jakie techniki należy zastosować, aby ukryć takie wrażliwe dane?
Edytować:
OK, więc prawie wszyscy powiedzieliście: „Twój plik wykonywalny może zostać poddany inżynierii wstecznej” - oczywiście! To moje zwierzę domowe irytu, więc mam zamiar trochę narzekać tutaj:
Dlaczego na 99% (OK, więc może trochę przesadzam) wszystkich pytań związanych z bezpieczeństwem na tej stronie odpowiada torrent „nie ma możliwości stworzenia całkowicie bezpiecznego programu” - to nie jest pomocne odpowiedź! Bezpieczeństwo to przesuwająca się skala pomiędzy doskonałą użytecznością i brakiem bezpieczeństwa z jednej strony, a doskonałym bezpieczeństwem, ale brakiem użyteczności z drugiej.
Chodzi o to, że wybierasz swoją pozycję na tej ruchomej skali w zależności od tego, co próbujesz zrobić i środowiska, w którym będzie działać Twoje oprogramowanie. Nie piszę aplikacji do instalacji wojskowej, piszę aplikację na domowy komputer . Muszę zaszyfrować dane w niezaufanej sieci za pomocą wcześniej znanego klucza szyfrowania. W takich przypadkach „bezpieczeństwo przez zaciemnienie” jest prawdopodobnie wystarczające! Jasne, ktoś z wystarczającą ilością czasu, energii i umiejętności mógłby odtworzyć plik binarny i znaleźć hasło, ale wiecie co? Nie obchodzi mnie:
Czas potrzebny na wdrożenie bezpiecznego systemu na najwyższym poziomie jest droższy niż utrata sprzedaży z powodu pękniętych wersji (nie to, że faktycznie to sprzedaję, ale rozumiesz, o co mi chodzi). Ten modny trend w programowaniu wśród nowych programistów „pozwala robić to w najlepszy możliwy sposób” jest co najmniej głupi.
Dziękuję za poświęcenie czasu na odpowiedź na to pytanie - okazały się one bardzo pomocne. Niestety mogę zaakceptować tylko jedną odpowiedź, ale przegłosowałem wszystkie przydatne odpowiedzi.