Oto rzecz: W moim Qt4.6-Project używam bazy danych SQLite. Ta baza danych nie powinna być niezaszyfrowana na moim dysku twardym. Tak więc chcę, aby na każdym początku mojego programu użytkownik został poproszony o podanie hasła do odszyfrowania bazy danych. Oczywiście baza danych nigdy nie powinna być "widoczna" (nie zaszyfrowana) na moim twardym dysku.
Czy istnieje zatem możliwość odszyfrowania bazy danych SQLite "w locie" oraz odczytu i zapisu danych? Jaki algorytm jest tutaj najlepszy (może AES)?
Gdy nie jest to możliwe (lub bardzo wolno), może lepiej zaszyfrować każdy ciąg w bazie danych i odszyfrować ciąg znaków, gdy hasło było poprawne (aby użytkownik mógł otworzyć bazę danych, ale nie ma pojęcia, co wszystkie wpisy mogłyby oznaczać)?Szyfruj/odszyfruj bazę danych SQLite i używaj jej "w locie".
Odpowiedz
Nie ma wbudowanego wsparcia, które mówi, że masz opcje.
1) Możesz szyfrować/odszyfrowywać wszystkie swoje ciągi znaków, ale to dużo pracy, nie jest przezroczysta i nie pozwoli ci na takie rzeczy jak wyszukiwanie w bazie danych.
2) SQLiteCrypt i SQLCipher zrób to, czego szukasz.
Możesz ich używać prawie całkowicie przezroczysto i zazwyczaj mówi się, że mają tylko około 5% narzutów w porównaniu bez szyfrowania.
Najlepszym sposobem, jaki mogę wymyślić, jest użycie FUSE - "systemów plików w użytkownik-ziemia" - dostępnych dla systemów Linux, Mac OS X i innych lub innego zaszyfrowanego systemu plików. Spowoduje to, że SQLite zobaczy go jako niezaszyfrowany podczas fizycznego szyfrowania na dysku. Grając z uprawnieniami, możesz upewnić się, że ludzie nie mają dostępu do nieszyfrowanego systemu plików.
Nie jestem pewien, czy SQLite ma sposób, aby przełamać procedury odczytu/zapisu niskiego poziomu, które pozwolą ci zaimplementować szyfrowanie w locie bez gier systemu plików. Przynajmniej nigdy nie musiałem tego robić. Możesz chcieć wyszukać takie żądanie funkcji i złożyć je, jeśli nie znajduje się w narzędziu do śledzenia problemów SQLite.
Sugerowałbym korzystanie z biblioteki, która robi to za ciebie, zamiast tworzyć własne szyfrowanie.
http://www.hwaci.com/sw/sqlite/see.html lub http://sqlite-crypt.com/documentation.htm
Użyj swojej ulubionej wyszukiwarki dla pewnych alternatyw.
Dodatkową opcją jest kodek kodowania SQLite dostarczany z biblioteką 1.9.9 (src/wrap/sqlite).
Ta opcja umożliwia dostosowanie typu szyfrowania w czasie kompilacji, w tym szyfrowania i trybu.
Ujawnienie: Ja współtworzyłem kodek do Botan.
ale kiedy używam innego API, nie mam już "użyteczności" Qt i SQLite, prawda? – Berschi
@Berschi: Prawdopodobnie musiałbyś przebudować komponent sqlite w Qt, ale zapewnia on źródło takich potrzeb. Myślę, że próba użycia jednego z tych komponentów będzie najlepszym rozwiązaniem. –
Powinieneś być w stanie użyć sterownika sqllite i skompilować go z sqllite dostarczonym przez SqlLitCrypt lub SQLCipher. Prawdopodobnie możesz osadzić część funkcji hasła w łańcuchu połączenia lub rozszerzyć klasę sterownika i wywołać bezpośrednio sterownik dla rozszerzonych funkcji –