sqlite python中的加密文件或数据库

w3nuxt5m  于 2023-01-05  发布在  SQLite
关注(0)|答案(5)|浏览(345)

我有一个sqlite3数据库,我可以在python中插入/选择它。这个应用程序运行得很好,但是我想调整一下,这样没有密码就没有人可以从数据库中读取数据。我怎么能在python中做到这一点呢?注意我不知道从哪里开始。

vh0rcniy

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...

beq87vna

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上发布最终的代码库和构建指令。

6g8kf2rb

6g8kf2rb3#

正如Frontware所建议的,您可以使用sqlcipher。
pysqlcipherpython包可以使其更易于使用,因为它使用sqlcipher代码合并来编译扩展。
应该只需要像使用常规sqlite.dbapi2一样使用pysqlcipher,设置正确的加密杂注即可。

dy1byipe

dy1byipe4#

SQLite数据库非常易于阅读,并且没有任何内置加密。
您是否担心有人直接访问和阅读数据库文件,或者通过您的程序访问它们?
我假设是前者,因为后者实际上与数据库无关--您所关心的是应用程序的安全性。
我想到了几个选项:
1.使用文件系统权限而不是加密来保护数据库。您没有提到您的环境是什么,所以我不能说这对您是否可行,但这可能是最简单和最可靠的方法,因为您不能尝试解密您无法读取的内容。
1.写之前用Python加密,阅读之后用Python解密,相当简单,但是会失去SQL基于集合的匹配操作的大部分功能。
1.切换到其他数据库;用户身份验证和权限是大多数多用户数据库的标准功能。2当你发现自己遇到了一个工具的局限性时,看看其他工具可能比在当前工具中加入新功能更容易。

9ceoxa92

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()

相关问题