2011-12-28 16:39:50 +00:00
|
|
|
|
== SQLCipher ==
|
2008-07-30 17:15:55 +00:00
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
SQLCipher is an SQLite extension that provides transparent 256-bit AES encryption of
|
|
|
|
|
database files. Pages are encrypted before being written to disk and are decrypted
|
|
|
|
|
when read back. Due to the small footprint and great performance it’s ideal for
|
|
|
|
|
protecting embedded application databases and is well suited for mobile development.
|
2008-07-30 17:15:55 +00:00
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
The official SQLCipher software site is http://sqlcipher.net
|
2008-07-30 17:15:55 +00:00
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
SQLCipher was initially developed by Stephen Lombardo at Zetetic LLC
|
|
|
|
|
(sjlombardo@zetetic.net) as the encrypted database layer for Strip,
|
|
|
|
|
an iPhone data vault and password manager (http://getstrip.com).
|
2009-07-09 04:58:58 +00:00
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
[Features]
|
2009-07-09 04:58:58 +00:00
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
- Fast performance with as little as 5-15% overhead for encryption on many operations
|
|
|
|
|
- 100% of data in the database file is encrypted
|
|
|
|
|
- Good security practices (CBC mode, key derivation)
|
|
|
|
|
- Zero-configuration and application level cryptography
|
|
|
|
|
- Algorithms provided by the peer reviewed OpenSSL crypto library.
|
2008-07-30 17:33:57 +00:00
|
|
|
|
|
2008-07-31 01:47:23 +00:00
|
|
|
|
[Compiling]
|
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
Building SQLCipher is almost the same as compiling a regular version of
|
|
|
|
|
SQLite with two small exceptions:
|
2008-07-31 01:47:23 +00:00
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
1. You must define SQLITE_HAS_CODEC and SQLITE_TEMP_STORE=2 when building sqlcipher
|
|
|
|
|
2. You need to link against a OpenSSL's libcrypto
|
2008-07-31 01:47:23 +00:00
|
|
|
|
|
|
|
|
|
Example Static linking (replace /opt/local/lib with the path to libcrypto.a)
|
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" \
|
|
|
|
|
LDFLAGS="/opt/local/lib/libcrypto.a"
|
|
|
|
|
$ make
|
2008-07-31 01:47:23 +00:00
|
|
|
|
|
|
|
|
|
Example Dynamic linking
|
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" \
|
|
|
|
|
LDFLAGS="-lcrypto"
|
|
|
|
|
$ make
|
2008-07-31 01:47:23 +00:00
|
|
|
|
|
|
|
|
|
[Encrypting a database]
|
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
To specify an encryption passphrase for the database via the SQL interface you
|
|
|
|
|
use a pragma. The passphrase you enter is passed through PBKDF2 key derivation to
|
|
|
|
|
obtain the encryption key for the database
|
2008-07-31 01:47:23 +00:00
|
|
|
|
|
|
|
|
|
PRAGMA key = 'passphrase';
|
|
|
|
|
|
|
|
|
|
Alternately, you can specify an exact byte sequence using a blob literal. If you
|
|
|
|
|
use this method it is your responsibility to ensure that the data you provide a
|
|
|
|
|
64 character hex string, which will be converted directly to 32 bytes (256 bits) of
|
2011-12-28 16:39:50 +00:00
|
|
|
|
key data without key derivation.
|
2008-07-31 01:47:23 +00:00
|
|
|
|
|
2009-04-22 20:22:08 +00:00
|
|
|
|
PRAGMA key = "x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'";
|
2008-07-31 01:47:23 +00:00
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
To encrypt a database programatically you can use the sqlite3_key function.
|
|
|
|
|
The data provided in pKey is converted to an encryption key according to the
|
|
|
|
|
same rules as PRAGMA key.
|
|
|
|
|
|
2008-07-31 01:47:23 +00:00
|
|
|
|
|
|
|
|
|
int sqlite3_key(sqlite3 *db, const void *pKey, int nKey);
|
|
|
|
|
|
|
|
|
|
PRAGMA key or sqlite3_key should be called as the first operation when a database is open.
|
|
|
|
|
|
2009-04-21 16:37:23 +00:00
|
|
|
|
[Changing a database key]
|
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
To change the encryption passphrase for an existing database you may use the rekey pragma
|
2009-04-21 16:37:23 +00:00
|
|
|
|
after you've supplied the correct database password;
|
|
|
|
|
|
|
|
|
|
PRAGMA key = 'passphrase'; -- start with the existing database passphrase
|
2011-12-28 16:39:50 +00:00
|
|
|
|
PRAGMA rekey = 'new-passphrase'; -- rekey will reencrypt with the new passphrase
|
2009-04-21 16:37:23 +00:00
|
|
|
|
|
|
|
|
|
The hexrekey pragma may be used to rekey to a specific binary value
|
|
|
|
|
|
2009-04-22 20:22:08 +00:00
|
|
|
|
PRAGMA rekey = "x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'";
|
2009-04-21 16:37:23 +00:00
|
|
|
|
|
|
|
|
|
This can be accomplished programtically by using sqlite3_rekey;
|
|
|
|
|
|
|
|
|
|
sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey)
|
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
[Support]
|
|
|
|
|
|
|
|
|
|
The primary avenue for support and discussions is the SQLCipher users mailing list:
|
|
|
|
|
|
|
|
|
|
http://groups.google.com/group/sqlcipher
|
|
|
|
|
|
|
|
|
|
Issues or support questions on using SQLCipher should be entered into the
|
|
|
|
|
GitHub Issue tracker:
|
|
|
|
|
|
|
|
|
|
http://github.com/sjlombardo/sqlcipher/issues
|
|
|
|
|
|
|
|
|
|
Please DO NOT post issues, support questions, or other problems to blog
|
|
|
|
|
posts about SQLCipher as we do not monitor them frequently.
|
2009-04-21 16:37:23 +00:00
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
If you are using SQLCipher in your own software please let us know at
|
|
|
|
|
support@zetetic.net!
|
2008-07-31 01:47:23 +00:00
|
|
|
|
|
|
|
|
|
[License]
|
|
|
|
|
|
2008-11-25 17:36:44 +00:00
|
|
|
|
Copyright (c) 2008, ZETETIC LLC
|
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
|
|
|
modification, are permitted provided that the following conditions are met:
|
|
|
|
|
* Redistributions of source code must retain the above copyright
|
|
|
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
|
* Redistributions in binary form must reproduce the above copyright
|
|
|
|
|
notice, this list of conditions and the following disclaimer in the
|
|
|
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
|
* Neither the name of the ZETETIC LLC nor the
|
|
|
|
|
names of its contributors may be used to endorse or promote products
|
|
|
|
|
derived from this software without specific prior written permission.
|
|
|
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY
|
|
|
|
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
|
|
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
|
|
DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY
|
|
|
|
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
|
|
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
|
|
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2008-07-30 17:33:57 +00:00
|
|
|
|
|
2011-12-28 16:39:50 +00:00
|
|
|
|
== End SQLCipher ==
|
2008-07-30 17:15:55 +00:00
|
|
|
|
|
2008-07-30 13:15:43 +00:00
|
|
|
|
This directory contains source code to
|
|
|
|
|
|
|
|
|
|
SQLite: An Embeddable SQL Database Engine
|
|
|
|
|
|
|
|
|
|
To compile the project, first create a directory in which to place
|
|
|
|
|
the build products. It is recommended, but not required, that the
|
|
|
|
|
build directory be separate from the source directory. Cd into the
|
|
|
|
|
build directory and then from the build directory run the configure
|
|
|
|
|
script found at the root of the source tree. Then run "make".
|
|
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
|
|
tar xzf sqlite.tar.gz ;# Unpack the source tree into "sqlite"
|
|
|
|
|
mkdir bld ;# Build will occur in a sibling directory
|
|
|
|
|
cd bld ;# Change to the build directory
|
|
|
|
|
../sqlite/configure ;# Run the configure script
|
|
|
|
|
make ;# Run the makefile.
|
|
|
|
|
make install ;# (Optional) Install the build products
|
|
|
|
|
|
|
|
|
|
The configure script uses autoconf 2.61 and libtool. If the configure
|
|
|
|
|
script does not work out for you, there is a generic makefile named
|
|
|
|
|
"Makefile.linux-gcc" in the top directory of the source tree that you
|
|
|
|
|
can copy and edit to suit your needs. Comments on the generic makefile
|
|
|
|
|
show what changes are needed.
|
|
|
|
|
|
|
|
|
|
The linux binaries on the website are created using the generic makefile,
|
2009-12-03 21:24:07 +00:00
|
|
|
|
not the configure script. The windows binaries on the website are created
|
|
|
|
|
using MinGW32 configured as a cross-compiler running under Linux. For
|
|
|
|
|
details, see the ./publish.sh script at the top-level of the source tree.
|
|
|
|
|
The developers do not use teh configure script.
|
|
|
|
|
|
|
|
|
|
SQLite does not require TCL to run, but a TCL installation is required
|
|
|
|
|
by the makefiles. SQLite contains a lot of generated code and TCL is
|
|
|
|
|
used to do much of that code generation. The makefile also requires
|
|
|
|
|
AWK.
|
2008-07-30 13:15:43 +00:00
|
|
|
|
|
|
|
|
|
Contacts:
|
|
|
|
|
|
|
|
|
|
http://www.sqlite.org/
|