我有一个sqlite3数据库,我可以在python中插入/选择它。这个应用程序运行得很好,但是我想调整一下,这样没有密码就没有人可以从数据库中读取数据。我怎么能在python中做到这一点呢?注意我不知道从哪里开始。
vh0rcniy1#
您可以使用SQLCipher。http://sqlcipher.net/SQLite的开源全数据库加密SQLCipher是一个SQLite扩展,它为数据库文件提供透明的256位AES加密。页面在写入磁盘之前加密,在读回时解密。由于占用空间小且性能出色,它非常适合保护嵌入式应用程序数据库,也非常适合移动的开发。1.对于许多操作的加密,性能极快,开销仅为5-15%1.数据库文件中的数据100%加密使用良好的安全做法(CBC模式、密钥派生)1.零配置和应用级加密广泛的平台1.支持:适用于C/C++,Obj-C,QT,Win32/.NET,Java,Python,Ruby等操作系统,Linux,iPhone/iOS...
beq87vna2#
我也遇到过同样的问题,我的应用程序可能同时运行多个示例,因此,我不能只加密sqlite db文件就完事了,我也不相信用python加密数据是个好主意,因为在这种状态下,你不能对数据库进行任何重要的数据操作。考虑到这些制约因素,我提出了以下两个解决办法:1.使用前面提到的SQLCipher。我在这里看到的问题是,我将不得不为Python编写自己的绑定,并自己编译它(或支付费用)。我可能会在任何情况下这样做,因为这将是一个伟大的解决方案,为其他Python开发人员在那里。如果我成功了,我会张贴回来的解决方案。1.如果选项1对我来说太难,或者太耗时,我将使用这种方法。这种方法不安全。我将使用pycrypto加密数据库文件。我将实现一个SQL“服务器”,它将解密数据库文件,然后处理来自各种客户端的请求。每当没有未完成的请求时,它将重新加密数据库。总的来说,这将更慢。并使数据库处于临时解密状态。希望这些想法对下一个家伙有帮助。
2013年1月13日编辑
我放弃了SQLCipher,因为我似乎无法让它编译,代码库正在尝试使用OpenSSL,虽然它是一个声音库,但对于简单的AES128来说,它是一个相当庞大的代码库。我找到了另一个选项wxSQLite3,并且我发现了如何只分离SQLite加密部分:https://github.com/shenghe/FreeSQLiteEncryption。我能够让它编译并工作(使用最新版本的SQLite3)。wxSQLite3还支持AES 256,这真的很酷。我的下一步将尝试编译pysqlite(这是python中内置的sqlite库)与修改后的sqlite3.dll匹配。wxSQLite3的sqlite3.dll的加密部分。在任何情况下,我都会尝试用我的结果更新这个线程,如果成功,我会在Github上发布最终的代码库和构建指令。
6g8kf2rb3#
正如Frontware所建议的,您可以使用sqlcipher。pysqlcipherpython包可以使其更易于使用,因为它使用sqlcipher代码合并来编译扩展。应该只需要像使用常规sqlite.dbapi2一样使用pysqlcipher,设置正确的加密杂注即可。
dy1byipe4#
SQLite数据库非常易于阅读,并且没有任何内置加密。您是否担心有人直接访问和阅读数据库文件,或者通过您的程序访问它们?我假设是前者,因为后者实际上与数据库无关--您所关心的是应用程序的安全性。我想到了几个选项:1.使用文件系统权限而不是加密来保护数据库。您没有提到您的环境是什么,所以我不能说这对您是否可行,但这可能是最简单和最可靠的方法,因为您不能尝试解密您无法读取的内容。1.写之前用Python加密,阅读之后用Python解密,相当简单,但是会失去SQL基于集合的匹配操作的大部分功能。1.切换到其他数据库;用户身份验证和权限是大多数多用户数据库的标准功能。2当你发现自己遇到了一个工具的局限性时,看看其他工具可能比在当前工具中加入新功能更容易。
9ceoxa925#
您可以使用存储在内存(RAM)中的数据库,并且只保存使用加密模块获得的加密版本。然后,您可以通过解密存储的内容并在内存中重新创建数据库来访问它。
##imports from cryptography.fernet import Fernet from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC from cryptography.hazmat.primitives import hashes from cryptography.hazmat.backends import default_backend import base64 from os import getcwd import sqlite3 import gzip ##creating key def key_creation(password): kdf=PBKDF2HMAC(algorithm = hashes.SHA256(), salt=b'\xfaz\xb5\xf2|\xa1z\xa9\xfe\xd1F@1\xaa\x8a\xc2', iterations=1024, length=32, backend=default_backend()) key=Fernet(base64.urlsafe_b64encode(kdf.derive(password))) return key ## encryption def encryption(b, password): f=key_creation(password) safe=f.encrypt(b) return safe ## decryption def decryption(safe, password): f=key_creation(password) b=f.decrypt(safe) return b ## def open_cdb(name,password): f=gzip.open(getcwd()+name+'_crypted.sql.gz','rb') safe=f.read() f.close() content=decryption(safe,password) content=content.decode('utf-8') con=sqlite3.connect(':memory:') con.executescript(content) return con ## def save_cdb(con,name,password): fp=gzip.open(getcwd()+name+'_crypted.sql.gz','wb') b=b'' for line in con.iterdump(): b+=bytes('%s\n','utf8') % bytes(line,'utf8') b=encryption(b,password) fp.write(b) fp.close() ##test if __name__=='__main__': password=b'Sw0rdFish' name='PRODUCTS' conn = sqlite3.connect(':memory:') conn.execute('CREATE TABLE PRODUCTS (ID INT PRIMARY KEY NOT NULL,\nNAME TEXT NOT NULL,\nPRICE REAL NOT NULL,\nTAXES REAL NOT NULL);') save_cdb(conn,name,password) conn.close() conn = open_cdb(name,password) cursor = conn.execute('select * from ' + name) headers = list(map(lambda x: x[0], cursor.description)) print(headers) for x in cursor: for j in range(len(x)): print(headers[j]+' ',x[j]) print('\n') conn.close()
5条答案
按热度按时间vh0rcniy1#
您可以使用SQLCipher。
http://sqlcipher.net/
SQLite的开源全数据库加密
SQLCipher是一个SQLite扩展,它为数据库文件提供透明的256位AES加密。页面在写入磁盘之前加密,在读回时解密。由于占用空间小且性能出色,它非常适合保护嵌入式应用程序数据库,也非常适合移动的开发。
1.对于许多操作的加密,性能极快,开销仅为5-15%
1.数据库文件中的数据100%加密使用良好的安全做法(CBC模式、密钥派生)
1.零配置和应用级加密广泛的平台
1.支持:适用于C/C++,Obj-C,QT,Win32/.NET,Java,Python,Ruby等操作系统,Linux,iPhone/iOS...
beq87vna2#
我也遇到过同样的问题,我的应用程序可能同时运行多个示例,因此,我不能只加密sqlite db文件就完事了,我也不相信用python加密数据是个好主意,因为在这种状态下,你不能对数据库进行任何重要的数据操作。
考虑到这些制约因素,我提出了以下两个解决办法:
1.使用前面提到的SQLCipher。我在这里看到的问题是,我将不得不为Python编写自己的绑定,并自己编译它(或支付费用)。我可能会在任何情况下这样做,因为这将是一个伟大的解决方案,为其他Python开发人员在那里。如果我成功了,我会张贴回来的解决方案。
1.如果选项1对我来说太难,或者太耗时,我将使用这种方法。这种方法不安全。我将使用pycrypto加密数据库文件。我将实现一个SQL“服务器”,它将解密数据库文件,然后处理来自各种客户端的请求。每当没有未完成的请求时,它将重新加密数据库。总的来说,这将更慢。并使数据库处于临时解密状态。
希望这些想法对下一个家伙有帮助。
2013年1月13日编辑
我放弃了SQLCipher,因为我似乎无法让它编译,代码库正在尝试使用OpenSSL,虽然它是一个声音库,但对于简单的AES128来说,它是一个相当庞大的代码库。
我找到了另一个选项wxSQLite3,并且我发现了如何只分离SQLite加密部分:https://github.com/shenghe/FreeSQLiteEncryption。我能够让它编译并工作(使用最新版本的SQLite3)。wxSQLite3还支持AES 256,这真的很酷。我的下一步将尝试编译pysqlite(这是python中内置的sqlite库)与修改后的sqlite3.dll匹配。wxSQLite3的sqlite3.dll的加密部分。在任何情况下,我都会尝试用我的结果更新这个线程,如果成功,我会在Github上发布最终的代码库和构建指令。
6g8kf2rb3#
正如Frontware所建议的,您可以使用sqlcipher。
pysqlcipherpython包可以使其更易于使用,因为它使用sqlcipher代码合并来编译扩展。
应该只需要像使用常规sqlite.dbapi2一样使用pysqlcipher,设置正确的加密杂注即可。
dy1byipe4#
SQLite数据库非常易于阅读,并且没有任何内置加密。
您是否担心有人直接访问和阅读数据库文件,或者通过您的程序访问它们?
我假设是前者,因为后者实际上与数据库无关--您所关心的是应用程序的安全性。
我想到了几个选项:
1.使用文件系统权限而不是加密来保护数据库。您没有提到您的环境是什么,所以我不能说这对您是否可行,但这可能是最简单和最可靠的方法,因为您不能尝试解密您无法读取的内容。
1.写之前用Python加密,阅读之后用Python解密,相当简单,但是会失去SQL基于集合的匹配操作的大部分功能。
1.切换到其他数据库;用户身份验证和权限是大多数多用户数据库的标准功能。2当你发现自己遇到了一个工具的局限性时,看看其他工具可能比在当前工具中加入新功能更容易。
9ceoxa925#
您可以使用存储在内存(RAM)中的数据库,并且只保存使用加密模块获得的加密版本。然后,您可以通过解密存储的内容并在内存中重新创建数据库来访问它。