您的位置:首页 > 数据库

sqlcipher 命令行使用及工具下载

2014-09-17 15:13 281 查看
sqlcipher 加密数据库后想要查看数据库 ,需使用使用sqlcipher windows 命令工具

注意 使用的工具也分版本,要与加密数据库的版本对应起来,否则查看不到表

下载地址:

对应2.x

http://download.csdn.net/detail/zhanghw0917/7931759

3.01版本

http://download.csdn.net/detail/zhanghw0917/7931909

转载 http://www.cnblogs.com/treecat-roboto/p/3873707.html

加密后使用命令行还是可以查看滴

1. 创建加密数据库

$ sqlcipher encrypted.db

SQLCipher version 3.8.4.3 2014-04-03 16:53:12

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> PRAGMA key = 'thisiskey';

sqlite> create table encrypted (id integer, name text);

sqlite> .schema

CREATE TABLE encrypted (id integer, name text);

sqlite> .q

2. 打开加密数据库

$ sqlcipher encrypted.db

SQLCipher version 3.8.4.3 2014-04-03 16:53:12

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> PRAGMA key = 'thisiskey';

sqlite> .schema

CREATE TABLE encrypted (id integer, name text);

3. 修改数据库密码

 sqlite> PRAGMA rekey = 'newkey';

 4. 加密已有的数据库

 $ sqlcipher banklist.sqlite3 

SQLCipher version 3.8.4.3 2014-04-03 16:53:12

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'thisiskey';

sqlite> SELECT sqlcipher_export('encrypted');

sqlite> DETACH DATABASE encrypted;

5. 解密数据库

$ sqlcipher encrypted.db 

SQLCipher version 3.8.4.3 2014-04-03 16:53:12

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> PRAGMA key = 'thisiskey';

sqlite> ATTACH DATABASE 'plaintext.db' AS plaintext KEY '';

sqlite> SELECT sqlcipher_export('plaintext');

sqlite> DETACH DATABASE plaintext;

 转自 : http://my.oschina.net/kjpioo/blog/149290

satckoverflow.com上有人提到过在

sqlite> sqlcipher-shell32.exe  test.db

sqlite> PRAGMA KEY = '12345';

给刚打开的数据库设置密码后,马上接着往数据库执行create table和 insert操作。最后用

sqlite> .e

退出该数据库。但是下次再用

sqlite> sqlcipher-shell32.exe  test.db

登录,在输入密码前执行了.schema等其他操作

sqlite>.schema

Error: file is encrypted or is not a database

sqlite> PRAGMA KEY = '12345';

Error: file is encrypted or is not a database

遭到提示:Error: file is encrypted or is not a database

根据官方以上英文描述,这个问题就是因为操作上没有遵循just-in-time key derivation的要求,没有首先输密码解密再进行其他操作。

有图为证:

----------------以下为正确操作过程:

SQLite version 3.7.15.2 2013-01-09 11:53:05

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> PRAGMA KEY = '12345';

sqlite> .schema

CREATE TABLE t(name text);

sqlite> select * from t;

n1

sqlite>

----------------以下为错误操作过程:

Enter SQL statements terminated with a ";"

sqlite> .schema

Error: file is encrypted or is not a database

sqlite> PRAGMA KEY = '12345';

sqlite> .schema

Error: file is encrypted or is not a database

sqlite>

确实如此。

以上过程你可以自己亲自验证以下。

注意:通过命令行( sqlcipher-shell32.exe) 执行命令,与通过sqlite3
api调用操作sqlite3数据库,是一样的道理

参考:

https://www.zetetic.net/sqlcipher/sqlcipher-api/#key


PRAGMA key 

The process of creating a new, encrypted database is called “keying” the database. SQLCipher uses just-in-time key derivation at the point it is first needed for an operation. This means that the key (and any options) must be set before the first operation
on the database. As soon as the database is touched (e.g. 
SELECT, CREATE TABLE, UPDATE
,
etc.) and pages need to be read or written, the key is prepared for use.


Example 1: Passphrase with Key Derivation

The key itself can be a passphrase, which is converted to a key using PBKDF2 key derivation. The
result is used as the encryption key for the database.
sqlite> PRAGMA key = 'passphrase';


Example 2: Raw Key Data (Without Key Derivation)

Alternatively, it is possible to specify an exact byte sequence using a blob literal. With this method, it is the calling application's responsibility to ensure that the data provided is a 64 character hex string, which will be converted directly to 32 bytes
(256 bits) of key data.
sqlite> PRAGMA key = "x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'";


Testing the Key

When opening an existing database, 
PRAGMA key
 will not immediately throw an error if
the key provided is incorrect. To test that the database can be successfully opened with the provided key, it is necessary to perform some operation on the database (i.e. read from it) and confirm it is success.

The easiest way to do this is select off the sqlite_master table, which will attempt to read the first page of the database and will parse the schema.
sqlite> PRAGMA key = 'passphrase';sqlite> SELECT count(*) FROM sqlite_master; -- if this throws an error, the key was incorrect. If it succeeds and returns a numeric value, the key is correct;


The same check can be implemented in C code
sqlite3_key(database, "test123", 7);
if (sqlite3_exec(database, "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
// key is correct.
} else {
// key is incorrect
}


Implementation Notes

PRAGMA key
 should generally
be called as the first operation on a database.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: