sqlcipher加密原理_sqlserver数据库加密

sqlcipher加密原理_sqlserver数据库加密使用 sqlcipher.exe可以在输入密码后,查看加密数据库的内容。但是要编码查询数据库的内容,还要另寻方法。(相关的工具和库在我的百度网盘中)使用sqlcipherwindow

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

使用 sqlcipher.exe 可以在输入密码后,查看加密数据库的内容。

但是要编码查询数据库的内容,还要另寻方法。(相关的工具和库在我的百度网盘中)

使用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. 解密数据库(生成无密码的数据库: plaintext.db)
$ sqlcipher-shell32 encrypted.db 

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.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166996.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月5日 下午11:16
下一篇 2022年8月5日 下午11:36


相关推荐

  • 深入浅出DDR系列(二)–DDR工作原理

    深入浅出DDR系列(二)–DDR工作原理学习完了 DDR 的基本组成和硬件结构原理之后 从整体上了解了 DDR 的特性和静态图 包括原理 管脚图等 那么本章就要从动态的角度来分析时序结构 包括 read write 的整个过程到数据返回发生了什么 其中包括以下内容 DDR 是如何完成 Read Write 等的操作 DDR 的基本命令 DDR 的时序参数 DDR 的性能分析 1 DRAM 基本组成对于 DRAM 其主要由行和列组成 每一个 bit 中都是由类似右下图的类晶体管的结构组成 对于 sdram 的数据 可以通过控制 column 和 row 就可以访问 sd

    2026年3月18日
    1
  • ssh学习路线[通俗易懂]

    ssh学习路线[通俗易懂]传送门:www.cdgeek.comjava分成J2ME(移动应用开发),J2SE(桌面应用开发),J2EE(Web企业级应用),所以java并不是单机版的,只是面向对象语言。建议如果学习java体系的话可以这样去学习:*第一阶段:Java基础,包括java语法,面向对象特征,常见API,集合框架;*第二阶段:java界面编程,包括AWT,事件机制,SWING,这个部分也可…

    2022年6月24日
    29
  • 『Logstash』Logstash配置文件详解

    『Logstash』Logstash配置文件详解读完这篇文章里你能收获到 Logstash 配置文件详解

    2026年3月19日
    2
  • gtk学习总结:GTK从入门到放弃,三天包教包会

    gtk学习总结:GTK从入门到放弃,三天包教包会今天花了一些时间复习之前学习过的 gtk 感觉东西光学不用忘得好快啊 在这做个之前学过的内容的备份 希望对大家有用 也希望大家不要从入门到放弃 文中有些代码例子可能来自 GTK 从入门到精通 吧 我不记得了 或者叫 GTK 中文教程 忘记了 总之 这是一个学习笔记 希望不触及任何人的利益 起到共享学习之用 目录编译方法编译脚本 01 一个简单的按钮 02 两个按钮 03 vbox 一

    2026年3月18日
    2
  • 万年历matlab算法,万年历算法(万年历算法和分析)[通俗易懂]

    年历的计算方法:关键是求出当年1月1日是星期几。书上给出了当年份Y>。用蔡勒(Zeller)公式即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡.年历的计算方法:关键是求出当年1月1日是星期几。书上给出了当年份Y的公式来计算天天从已知的日期:?G=4C…

    2022年4月6日
    43
  • nginx reload不生效_nginx权重配置

    nginx reload不生效_nginx权重配置解释/usr/local/nginx/sbin/nginx-sreload 用过多次这条命令,一直以为是重启Nginx,今天有幸看了下Nginx官方文档介绍这条命令 Nginx服务不会终止,主进程检查配置,应用配置的过程。主进程会启动一个新的工作进程处理新来的请求。主进程发送消息给老的工作进程,通知老的进程不在接受请求,处理完现有的请求后退出(优雅退出) …

    2025年6月19日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号