V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gdtv
V2EX  ›  PHP

请问有没有支持加密功能的单文件数据库?

  •  
  •   gdtv · 2017-02-04 00:21:33 +08:00 · 4299 次点击
    这是一个创建于 2851 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想用 php 开发一个在线记事本,记录一些非常私密的东西,首要要求是服务器被入侵后黑客也无法读取到我的文章内容.
    所以想要找一个支持加密功能的单文件数据库,例如 sqlite3,但是免费版本的 sqlite3 不支持加密功能.
    请问有没有类似 sqlite3 的其他的免费的支持加密功能的数据库呢?
    性能不重要,自己一个人用的.

    第 1 条附言  ·  2017-02-04 19:45:16 +08:00
    初步决定用 4 楼的方法,加密入库,搜索的时候遍历一次数据库,逐条记录解密后查找,因为个人使用数据量不会太大,并且搜索不会很频繁,所以搜索的性能问题可以接受
    41 条回复    2017-03-09 00:11:02 +08:00
    honeycomb
        1
    honeycomb  
       2017-02-04 00:35:06 +08:00 via Android
    keepass 数据库格式?
    SingeeKing
        2
    SingeeKing  
       2017-02-04 00:37:53 +08:00 via iPhone
    非对称加密就可以了吧
    yexiaoxing
        3
    yexiaoxing  
       2017-02-04 01:14:26 +08:00
    换个思路,在 php 做加解密?
    SuperMild
        4
    SuperMild  
       2017-02-04 01:23:01 +08:00   ❤️ 1
    php 加密后入数据库,缺点是不能搜索,但由于是一个人用数据量很小,可以每次把整个数据库读出来解密后放进一个临时数据库,这样就能搜索了,用完删除临时数据库。
    springz
        5
    springz  
       2017-02-04 01:36:49 +08:00   ❤️ 1
    DES 加密后密文存进数据库呗,你自己掌握 key
    ryd994
        6
    ryd994  
       2017-02-04 05:25:31 +08:00 via Android
    换个思路, luks
    自己要用再挂载
    cnwtex
        7
    cnwtex  
       2017-02-04 08:31:38 +08:00 via iPhone
    只要 PHP 能读写,入侵的人就能读写,这种场景谈什么加密
    wwqgtxx
        8
    wwqgtxx  
       2017-02-04 08:39:31 +08:00
    最简单的办法,在网页端用 JS 加密,密码自己掌握即可,就算破了你的服务器也拿不到有用的数据
    zjgsamuel
        9
    zjgsamuel  
       2017-02-04 08:47:26 +08:00
    额~~ 最近也在构思自己的一个日记应用 有类似场景的需求 LZ 找到好的解决方案 记得分享一下哈~
    missdeer
        10
    missdeer  
       2017-02-04 08:49:39 +08:00
    基于 sqlite3 的 sqlcipher 有免费版本的
    gdtv
        11
    gdtv  
    OP
       2017-02-04 10:03:12 +08:00
    @springz DES 加密后密文存进数据库呗,这样在数据库里就无法全文搜索了,就无法搜索文章了
    gdtv
        12
    gdtv  
    OP
       2017-02-04 10:03:28 +08:00
    @yexiaoxing 在 php 做加解密,这样在数据库里就无法全文搜索了,就无法搜索文章了
    gdtv
        13
    gdtv  
    OP
       2017-02-04 10:04:42 +08:00
    @missdeer sqlcipher 有看过,但我不太熟悉 linux 配置,试过编译 sqlcipher 没成功
    gdtv
        14
    gdtv  
    OP
       2017-02-04 10:05:13 +08:00
    @wwqgtxx 请问网页端用 JS 加密是什么意思?可以再说说吗?
    xenme
        15
    xenme  
       2017-02-04 10:12:44 +08:00 via iPhone
    @gdtv 发送的是加密后的内容啊
    gdtv
        16
    gdtv  
    OP
       2017-02-04 10:14:24 +08:00
    @SuperMild 你说的方案我也有考虑过,但我怕数据量太大。另外放进一个临时数据库,万一没来得及删除服务器就被黑了。。。。
    gdtv
        17
    gdtv  
    OP
       2017-02-04 10:14:37 +08:00
    @xenme 这样在数据库里就无法全文搜索了,就无法搜索文章了
    mogging
        18
    mogging  
       2017-02-04 10:16:15 +08:00 via iPhone
    @missdeer 微信就是用这个加密的,以前有老外写过详细的技术文章
    grayon
        19
    grayon  
       2017-02-04 10:25:22 +08:00
    全文搜索你怎么做?分词做索引啊
    springz
        20
    springz  
       2017-02-04 10:39:28 +08:00
    BerkeleyDB
    gdtv
        21
    gdtv  
    OP
       2017-02-04 10:49:06 +08:00
    @grayon 全文搜索,直接用 like ,因为数据量小性能不是问题
    grayon
        22
    grayon  
       2017-02-04 11:04:28 +08:00
    用移位加密或者替换加密就好了
    SuperMild
        23
    SuperMild  
       2017-02-04 11:04:35 +08:00 via iPhone
    @gdtv 一个人用数据量应该不大,临时数据库可以放在客户端 js 里,服务器的数据库一直只储存加密后的文本。
    gdtv
        24
    gdtv  
    OP
       2017-02-04 11:44:33 +08:00
    @SuperMild 我看了我的谷歌文档,几年来一共有 100M 的 word 文档,如果换成 txt ,估计至少要 20M 吧, 20M 的东西塞在 js 里可以吗? 另外放 js 里似乎更不安全吧,有时在别人的电脑上网, js 会留在别人的电脑缓存里。
    wwqgtxx
        25
    wwqgtxx  
       2017-02-04 12:09:32 +08:00
    @gdtv 就是你在浏览器端用 JS 来进行 AES 加密之后再保存到服务器,这样谁拿到服务器都没啥用,当然,这样你就没法在服务器端全文搜索了
    SuperMild
        26
    SuperMild  
       2017-02-04 12:49:48 +08:00
    @gdtv 20M 小意思,现在宽带下载也很快,但是用手机流量访问时太费流量。缓存的问题应该可以通过设过期时限来解决吧(未确认),不过如果能在服务端用原生支持加密的数据库当然是最好的。
    guxin0123
        27
    guxin0123  
       2017-02-04 16:42:37 +08:00
    ms access ???
    lslqtz
        28
    lslqtz  
       2017-02-04 17:40:54 +08:00 via iPhone
    Windows BitLocker
    要用的时候 exec 解密,否则加密
    根据传入的密码来,但是也不是绝对安全的,因为可以修改文件抓密钥
    lslqtz
        29
    lslqtz  
       2017-02-04 17:41:36 +08:00 via iPhone
    @wwqgtxx 拿到服务器修改 JS ,将密码发往服务器一份。
    lslqtz
        30
    lslqtz  
       2017-02-04 17:42:46 +08:00 via iPhone
    建议用 HTML+AES+Chrome 扩展(读取 /写入本地文件)或 localStorage (注意备份)做成单机版的
    phithon
        31
    phithon  
       2017-02-04 17:56:28 +08:00   ❤️ 1
    免费版本的 sqlite3 其实是预留了加密、解密接口的。
    给你一个我大二时候写的密码管理器,代码乱七八糟的别吐槽,但其中有 sqlite3 的加密实现,这个软件的登录密码其实就是 aes 的密钥。
    https://github.com/phith0n/PasswordKeeper
    这个库就是一个 dll ,理论上用什么语言操作都不影响,但我没试过用 PHP 行不行。
    Khlieb
        32
    Khlieb  
       2017-02-04 18:26:49 +08:00 via Android
    HSQLDB?
    limhiaoing
        33
    limhiaoing  
       2017-02-04 21:24:58 +08:00
    gdtv
        34
    gdtv  
    OP
       2017-02-04 23:14:58 +08:00
    @limhiaoing 这个是收费的
    jimzhong
        35
    jimzhong  
       2017-02-05 09:10:10 +08:00
    请问 LZ 的密钥如何存储呢?是由用户在每次加密 /解密时提供还是存在服务器上?
    gdtv
        36
    gdtv  
    OP
       2017-02-05 10:54:54 +08:00
    @jimzhong 密钥由用户在每次登录网站的时候输入,也就是网站的登录密码,登录成功后将密钥加密存放到 cookie 里。网站启用 https 。
    jimzhong
        37
    jimzhong  
       2017-02-05 11:33:59 +08:00
    @gdtv cookie 容易被盗用,用服务端的 session 会不会更好一些?
    gdtv
        38
    gdtv  
    OP
       2017-02-05 11:37:43 +08:00
    @jimzhong 用 session 好些
    nilai
        39
    nilai  
       2017-02-05 13:41:52 +08:00
    SQLCipher +1
    xieranmaya
        40
    xieranmaya  
       2017-02-05 22:54:30 +08:00
    @lslqtz 这个思路很不错啊,我第一反应也是这么做。每次修改数据后把加密后的数据全量备份到 vps 上去,甚至扔 github 上都行
    czb
        41
    czb  
       2017-03-09 00:11:02 +08:00 via Android
    ABC.li 这个网站的思路估计和你的差不多
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 84ms · UTC 19:06 · PVG 03:06 · LAX 11:06 · JFK 14:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.