Results 1 to 20 of 24

Thread: Protecting SQLite Data

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Join Date
    Jan 2006
    Location
    Germany
    Posts
    4,380
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows Symbian S60
    Thanks
    19
    Thanked 1,005 Times in 913 Posts
    Wiki edits
    5

    Default Re: Protecting SQLite Data

    Quote Originally Posted by squidge View Post
    Do remember that the database is only secure whilst you keep the passphrase/key confidential. If you expose the key in plain text in your application for example it will be very easy for someone to find with a simple hex editor.
    That's a topic what is on my mind since I wrote the article. But since I am not really an encryption specialist and my application where I use encrypted databases is not a high secure one, I am currently satisfied with:
    • Store an ascii string in the source code
    • Do a caesar cipher
    • Do some letter swaps
    • Do some position swaps

    That's not secure after all, I know, but it for my use right now it is ok.


    If any of you is more into encryption stuff, it would be nice you if you would extend our wiki with a short article on how to store a password along an application in a safe way.

  2. #2
    Join Date
    Jun 2007
    Location
    India
    Posts
    1,042
    Qt products
    Qt3 Qt4 Qt/Embedded
    Platforms
    MacOS X Unix/X11 Windows
    Thanks
    8
    Thanked 133 Times in 128 Posts

    Default Re: Protecting SQLite Data

    Quote Originally Posted by Lykurg View Post
    That's a topic what is on my mind since I wrote the article. But since I am not really an encryption specialist and my application where I use encrypted databases is not a high secure one, I am currently satisfied with:
    • Store an ascii string in the source code
    • Do a caesar cipher
    • Do some letter swaps
    • Do some position swaps

    That's not secure after all, I know, but it for my use right now it is ok.


    If any of you is more into encryption stuff, it would be nice you if you would extend our wiki with a short article on how to store a password along an application in a safe way.
    no matter how much a mathematic guru anyone is, there is no full proof way to store a password with your application.
    After any type of encryption of your key, You HAVE to decrypt it in your code and pass it to the sqlite function! and thats where your decrypted key can
    be easily seen in the debugger. The cracker doesn't need to go through you super duper decryption function in ASM to see it.

  3. #3
    Join Date
    Sep 2009
    Location
    UK
    Posts
    2,447
    Qt products
    Qt4
    Platforms
    Windows
    Thanks
    6
    Thanked 348 Times in 333 Posts

    Default Re: Protecting SQLite Data

    For the most basic of encryption, the only thing you need to do is to protect it against people "fishing" with a hex editor. For this, even if you just XOR each character of the password with a fixed number, it will satisfy the requirement (so Lykurg's method is more than enough here)

    Protecting against someone armed with a debugger is a complete story on itself. The easiest way to do this is to static link the SQLite library with your application and compress/encrypt the executable with an application such as Armadillo, PEcrypt, ASProtect and such like. The static linking removes the ability for anyone to compile there own (possibly rogue) version of SQLite and attach it to your application. This is permissable in any country which acknowledges software placed into the public domain (as is SQLite). Typically, this will make it too much effort for someone to want to hack you application to find the password (unless they are really determined, in which case, there's nothing you can do).

    Of course, you still need a reasonable password. Anyone can run your database through a dictionary attack. Ensure you use a long password consisting of letters, numbers and special characters.
    Last edited by squidge; 21st February 2011 at 09:13.

  4. #4
    Join Date
    Dec 2010
    Posts
    13
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows
    Thanks
    6

    Default Re: Protecting SQLite Data

    Thank you everyone!

    I followed through the SQLCIPHER tutorial on their website. Code ran, no errors.

    created a new db, set the key, encrypted it, attached it, copied my existing sql tables to it.

    I then opened the newly encrypted db with a regular firefox extesion. I was able to browse all the data on the encrypted db. I even tried using different keys on the same db, worked.

    It seems like the QSQLCIPHER is not encrypting the db, since the db can be viewed without unencrypting it.

  5. #5
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Wiki edits
    17

    Default Re: Protecting SQLite Data

    Works fine for me. You are using the Sqlcipher version of sqlite3, aren't you?

    Qt Code:
    1. // First, a freshly built sqlcipher
    2. chrisw@newton /tmp/sqlcipher $ ./sqlite3 plain.db
    3. SQLite version 3.7.2
    4. Enter ".help" for instructions
    5. Enter SQL statements terminated with a ";"
    6. sqlite> create table data(a integer);
    7. sqlite> insert into data values (1);
    8. sqlite> insert into data values (2);
    9. sqlite> insert into data values (3);
    10. sqlite> ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'secret';
    11. sqlite> create table encrypted.data as select * from data;
    12. sqlite> select * from encrypted.data;
    13. 1
    14. 2
    15. 3
    16. sqlite> .q
    17.  
    18. // See that the encrypted file is not identified as Sqlite
    19. chrisw@newton /tmp/sqlcipher $ file plain.db encrypted.db
    20. plain.db: SQLite 3.x database
    21. encrypted.db: data
    22.  
    23. // And that the data is there
    24. chrisw@newton /tmp/sqlcipher $ ./sqlite3 encrypted.db
    25. SQLite version 3.7.2
    26. Enter ".help" for instructions
    27. Enter SQL statements terminated with a ";"
    28. sqlite> pragma key = "secret";
    29. sqlite> .tables
    30. data
    31. sqlite> select * from data;
    32. 1
    33. 2
    34. 3
    35. sqlite> .q
    36.  
    37. // Now with the system, non-encrypting sqlite3
    38. chrisw@newton /tmp/sqlcipher $ /usr/bin/sqlite3 encrypted.db
    39. SQLite version 3.7.2
    40. Enter ".help" for instructions
    41. Enter SQL statements terminated with a ";"
    42. sqlite> .tables
    43. Error: file is encrypted or is not a database
    44. sqlite> .q
    To copy to clipboard, switch view to plain text mode 

  6. The following user says thank you to ChrisW67 for this useful post:

    zim (24th February 2011)

  7. #6
    Join Date
    Dec 2010
    Posts
    13
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows
    Thanks
    6

    Question Re: Protecting SQLite Data

    This is my code, and I am not getting any errors.

    Somehow the db is unencrypted.

    Qt Code:
    1. #include <QtSql/QSqlError>
    2. #include <QtSql/QSqlDatabase>
    3. #include <QtSql/QSqlQuery>
    4. #include <QtSql/QSqlRecord>
    5. #include <QVariant>
    6. #include <QDebug>
    7.  
    8. shonaDB::shonaDB()
    9. {
    10. db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLCIPHER","newDB"));
    11. dbCopy = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLCIPHER","oldDB"));
    12. dbCopy->setDatabaseName("shonaOld.db");
    13. db->setDatabaseName("shonaNew.db");
    14.  
    15. if(!db->open())
    16. {
    17. qDebug() << "db open fail";
    18. }
    19.  
    20. if(!dbCopy->open())
    21. {
    22. qDebug() << "dbCopy open fail";
    23. }
    24.  
    25.  
    26. QSqlQuery qry(QSqlDatabase::database("newDB"));
    27.  
    28. qry.prepare("PRAGMA key = 'xyz'");
    29.  
    30. if(!qry.exec())
    31. {
    32. qDebug() << "key fail";
    33. }
    34.  
    35. }
    36.  
    37.  
    38.  
    39.  
    40. void shonaDB::copyDatabase()
    41. {
    42.  
    43. QSqlQuery qry(QSqlDatabase::database("newDB"));
    44.  
    45. qry.prepare("ATTACH DATABASE 'newDB' AS encrypted KEY 'xyz' ");
    46.  
    47. if(!qry.exec())
    48. {
    49. qDebug() << dbCopy->lastError().text();
    50. }else{
    51. qDebug()<< "Success ATTACH";
    52. }
    53.  
    54. qry.prepare("CREATE TABLE encrypted.dictionary (txtVar text, txtVarTwo text, txtVarThree text);");
    55.  
    56. if(!qry.exec())
    57. {
    58. qDebug() << dbCopy->lastError().text();
    59. }else{
    60. qDebug()<< "Success ct";
    61. }
    62.  
    63.  
    64. qry.prepare("INSERT INTO encrypted.dictionary SELECT * FROM dictionary;");
    65.  
    66. if(!qry.exec())
    67. {
    68. qDebug() << dbCopy->lastError().text();
    69. }else{
    70. qDebug()<< "Success transfer";
    71. }
    72.  
    73.  
    74. }
    To copy to clipboard, switch view to plain text mode 

  8. #7
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Wiki edits
    17

    Default Re: Protecting SQLite Data

    Your copyDatabase() method should open the unencrypted database (i.e. oldDB), attach the encrypted database, and then push the table contents into the attached database. You are currently opening the newDB and attaching a second copy of the newDB. I am surprised that the create table doesn't fail.

  9. #8
    Join Date
    Dec 2010
    Posts
    13
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows
    Thanks
    6

    Default Re: Protecting SQLite Data

    Hi

    do you need two database objects to attach the encrypted database.

  10. #9
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Wiki edits
    17

    Default Re: Protecting SQLite Data

    If you are doing this in Qt code then you use a single db object and use a QSqlQuery to execute an ATTACH statement. The attachment is only good on that db instance in my experience. You need to open the unencrypted database and attach the encrypted database (your last code post doesn't do that).

    Once you have the encrypted database, do you need to allow the user to repeat this in your application? If not then why not just do the process from the command line as in my earlier example.
    Last edited by ChrisW67; 23rd March 2011 at 00:11.

  11. The following user says thank you to ChrisW67 for this useful post:

    zim (23rd March 2011)

  12. #10
    Join Date
    Apr 2010
    Posts
    769
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11
    Thanks
    1
    Thanked 94 Times in 86 Posts

    Default Re: Protecting SQLite Data

    It might be simpler to protect the website through any of a number of server controls that require a user to enter a password before access to a site is granted. These are simple to set up and most hosting services provide the services and tools required. Your unencrypted database then lives within the security provided by restricted access to the web page that interacts with it.

    This also makes it simple to grant a few priveleged users (or only yourself) access to administrator functions.

  13. #11
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Wiki edits
    17

    Default Re: Protecting SQLite Data

    Website? This looks like a desktop application.

  14. #12
    Join Date
    Apr 2010
    Posts
    769
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11
    Thanks
    1
    Thanked 94 Times in 86 Posts

    Default Re: Protecting SQLite Data

    Quote Originally Posted by ChrisW67 View Post
    Website? This looks like a desktop application.
    It wasn't clear to me; Firefox was mentioned earlier, so I thought I'd mention the server-based approach as an alternative.

  15. #13
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,373
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Thanks
    4
    Thanked 5,019 Times in 4,795 Posts
    Wiki edits
    10

    Default Re: Protecting SQLite Data

    I just read the thread and I'm still not convinced this whole approach is safe. At some point there will be a plaintext version of the password somewhere in the process memory and no executable mangling will prevent that. Dumping core at this moment will sooner or later reveal this password. To me only situations where you do not pass the plaintext password (like challenge and response solutions) are possible candidates for a good solution.
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  16. #14
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Wiki edits
    17

    Default Re: Protecting SQLite Data

    Quote Originally Posted by wysota View Post
    I just read the thread and I'm still not convinced this whole approach is safe. At some point there will be a plaintext version of the password somewhere in the process memory and no executable mangling will prevent that.
    This is the perpetual problem of any DRM scheme... you are giving the attacker both the encrypted data and the key. There's no way around it. All you can do is make it difficult to extract. For example, the Armadillo wrapper includes anti-dumping measures, anti-debugger measures, on-the-fly encryption of code segments, object file rearrangement and other things. Properly used the key is very hard to get at and you have to weigh the effort required to attack the protections against the value of the thing being protected.

  17. #15
    Join Date
    Sep 2009
    Location
    Wroclaw, Poland
    Posts
    1,394
    Qt products
    Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows Android
    Thanked 342 Times in 324 Posts

    Default Re: Protecting SQLite Data

    Somehow the db is unencrypted.
    Using windows xp, got the same issue, compiled sqlcipher and could open "encrypted" databases created with sqlcipher/sqlite3.exe with any sqlite browser.
    This is important how do you configure the sqlcipher, when I've followed the tutorial it wasn't working, but then I reconfigured using additional options:
    Qt Code:
    1. configure --disable-tcl --disable-amalgamation --prefix=/c/qt/src/plugins/sqldrivers/sqlcipher CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-LC:/OpenSSL-Win -leay32"
    To copy to clipboard, switch view to plain text mode 
    After make I get sqlite3.exe which I can use to create really encrypted databases ( as in ChrisW67 post ).

    ------------------------------
    edit:
    just tested the sqlcipher plugin for Qt, works ok too
    Last edited by stampede; 23rd March 2011 at 14:46.

Similar Threads

  1. Qt to Sqlite data insertion doubt.
    By rex in forum Qt Programming
    Replies: 15
    Last Post: 16th December 2010, 13:31
  2. Replies: 13
    Last Post: 6th December 2010, 05:41
  3. Sqlite and UTF8 data
    By kroenecker in forum Qt Programming
    Replies: 2
    Last Post: 19th April 2009, 15:49
  4. data not being retained in sqlite DB
    By sticcino in forum Qt Programming
    Replies: 2
    Last Post: 2nd July 2008, 11:42
  5. Write protecting cells
    By therealjag in forum Qt Programming
    Replies: 2
    Last Post: 12th February 2006, 10:47

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Qt is a trademark of The Qt Company.