草庐IT

sqlite - 加密SQLite

coder 2023-07-21 原文

我将编写自己的加密,但希望讨论一些内部知识。应该在多个移动平台上使用-iOS,Android,WP7,其中或多或少将台式机用作测试平台。

让我们首先从现有解决方案的简要特征入手:

  • SQLite标准(商业)SEE扩展-我不知道它在内部如何工作以及如何与提到的移动平台协作。
  • System.data.sqlite(仅Windows):完整的DB,ECB模式的RC4加密。他们还会加密数据库头,偶尔(0.01%的机会)会导致数据库损坏。*)额外的优势:他们使用SQLite合并分发。
  • SqlCipher(openssl,即多个平台):可选的加密方案。他们加密整个数据库。 CBC模式(我认为),随机IV向量。因此,他们必须修改页面参数(大小+保留空间以存储IV)。他们意识到与未加密读取DB header 有关的问题,并试图引入解决方法,但是该解决方案并不令人满意。额外的缺点:他们使用SQLite3源代码树。 (另一方面,启用了其他功能,即使用特殊的编译指示对加密参数进行微调。)

  • 根据我自己的分析,我认为以下可能是一个不错的解决方案,不会遇到上述问题:
  • 加密整个数据库,除了数据库头。
  • ECB模式:听起来有些冒险,但是在简要查看DB格式后,我无法想象如何将其用于攻击。
  • AES128?
  • 在SQLite合并之上的实现(类似于system.data.sqlite)

  • 我想讨论这种加密方案的可能问题。

    *)由于SQLite读取DB header 而不进行解密。由于RC4(流密码),此问题仅在首次使用时才会出现。 AES会更加危险,因为每个“ Activity 的” DB迟早都会遇到此问题。

    编辑-基于VFS的加密的情况

    上面提到的方法使用由sqlite.org认可的基于编解码器的方法。它是一组3个回调,其中最重要的是:
    void *(*xCodec)(void *iCtx, void *data, Pgno pgno, int mode)
    

    SQLite可以自行决定使用此回调来加密/解密从磁盘读取/写入磁盘的数据。数据一页一页地交换。 (页面是512 By的倍数。)

    另一种选择是使用VFS。 VFS是用于低级OS服务的一组回调。其中有几种与文件相关的服务,例如xOpen/xSeek/xRead/xWrite/xClose。特别是,这是用于数据交换的方法
    int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
    int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst);
    

    这些调用中的数据大小范围从4 By(常见情况)到DB页面大小。如果要使用块密码(还要使用什么?),则需要组织基础块缓存。我无法想象实现会像SQLite内置事务一样安全和高效。

    第二个问题:VFS的实现依赖于平台。 Android/iOS/WP7/台式机均使用不同的来源,即基于VFS的加密必须逐平台实现。

    下一个问题更加微妙:平台可能使用VFS调用来实现文件锁定。这些用途不得加密。而且,共享锁一定不能被缓冲。换句话说,VFS级别的加密可能会损害锁定功能。

    编辑-基于VFS的加密的明文攻击

    稍后我意识到了这一点:DB header 以固定字符串“SQLite format 3”开头, header 包含许多其他固定字节值。这为已知的纯文本攻击(KPA)打开了大门。

    这主要是基于VFS的加密问题,因为它没有DB头正在加密的信息。

    System.data.sqlite也有此问题,因为它还会对DB header 进行加密(RC4)。

    SqlCipher用盐覆盖hdr字符串,该盐用于将密码转换为 key 。此外,它默认使用AES,因此KPA攻击没有危险。

    最佳答案

    您不需要破解db格式或sqlite源代码。 SQLite公开了虚拟文件系统(vfs)API,该API可用于包装带有加密层的文件系统(或另一个vfs),该层可实时加密/解密页面。当我这样做时,事实证明这是非常简单的任务,只需几百行左右的代码。这样,整个数据库(包括日志文件)将被加密,并且对任何客户端代码都是完全透明的。典型的页面大小为1024,几乎可以使用任何已知的块密码。从我可以从他们的文档中得出的结论来看,这正是SQLCipher所做的。

    关于“问题”,您会看到:

  • 不需要重新实现文件系统支持,可以包装默认的VFS。因此,锁或平台相关性没有问题。
  • SQLite的默认OS后端也是VFS,使用VFS无需额外开销,只需要添加即可。
  • 您不需要块缓存。当然,当它仅需要4个字节时,您将不得不读取整个块,但不要对其进行缓存,因为它将永远不会被再次读取。 SQLite有自己的缓存来防止这种情况发生(Pager模块)。
  • 关于sqlite - 加密SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8384789/

    有关sqlite - 加密SQLite的更多相关文章

    1. ruby - 使用 AES 的 Rails 加密,过于复杂 - 2

      我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25

    2. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

      出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

    3. ruby - 如何使用私钥加密完全加密 Ruby 中的数据? - 2

      首先,关于我们系统的一些信息,它基本上是建筑行业的电子招标解决方案。所以:列表项我们的系统有多家公司每个公司都有多个用户每家公司可以创建多个拍卖然后其他公司可以为可用的拍卖提交他们的出价。一个出价包含数百或数千个单独的项目,我们只需要加密这些记录的“价格”部分。我们面临的问题是,我们的大客户不希望我们知道投标价格,至少在投标过程中是这样,这是完全可以理解的。现在,我们只是通过对称加密对价格进行加密,因此即使价格在数据库中有效加密,他们担心的是我们拥有解密价格的key。因此,我们正在研究某种形式的公钥加密系统。以下是我们对解决方案的初步想法:当一家公司注册时,我们会使用OpenSSL为其

    4. ruby-on-rails - 我如何比较 'Bcrypt' Gem解密的密码和加密的密码 - 2

      我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,

    5. ruby - 如何在Elixir中使用AES CBC 128进行加密和解密 - 2

      我在Rails中有一个具有以下方法的应用程序,该方法可以加密和解密文本并与Java客户端通信。defencrypt(string,key)cipher=OpenSSL::Cipher::AES.new(128,:CBC)cipher.encryptcipher.padding=1cipher.key=hex_to_bin(Digest::SHA1.hexdigest(key)[0..32])cipher_text=cipher.update(string)cipher_textexcenddefhex_to_bin(str)[str].pack"H*"enddefbin_to_hex(

    6. ruby-on-rails - 如何生成用于 attr_encrypted 的加密 key - 2

      我正在考虑使用attr_encrypted在Rails应用程序中用于字段级加密的gem。如何生成用于此gem的加密key?更新:Encryptor的文档,它是attr_encrypted使用的底层加密,声明如下(在Usage|Basic下):secret_key=Digest::SHA256.hexdigest('asecretkey')encrypted_value=Encryptor.encrypt('somestringtoencrypt',:key=>secret_key)我猜想key可以是任意长度的随机字符串,而对hexdigest的调用将从中计算出适当的固定长度字符串。这是

    7. ruby - 在Ruby中访问pgp加密文件 - 2

      我有一个pgp加密文件,我需要在运行时从中提取数据。这可以通过仅解密到内存来完成吗(而不是创建解密文件并在完成后将其删除)? 最佳答案 名为OpenPGP的Ruby库几个月前发布。看起来它对你有用。 关于ruby-在Ruby中访问pgp加密文件,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1083546/

    8. 酷早报:10月21日全球Web3加密行业重大资讯大汇总 - 2

      2022年10月21日星期五【数据指标】加密货币总市值:$0.95万亿BTC市值占比:38.51%恐慌贪婪指数:23极度恐慌 【今日快讯】1、【政讯】1.1.1、美联储布拉德:市场预期美联储11月会加息75个基点1.1.2、美联储哈克:将维持加息一段时间1.2、美国10年期国债收益率触及4.197%,为2008年6月以来最高1.3、法国数字转型部长:政府将专注于DeFi和Web31.4、巴西ATM机将于11月3日起支持USDT1.5、美众议院副议长将于11月初加入a16zCrypto担任政府事务主管1.6、香港数字资产托管机构FirstDigitalTrust首席执行官:香港仍是安全

    9. Ruby OpenSSL 非对称加密——使用两个 key 对 - 2

      我想使用两个key对在两个通信系统之间实现具有不可否认性的安全消息传递。我使用以下方法生成并存储了两组key对:sys1_key=OpenSSL::PKey::RSA.generate(2048)sys2_key=OpenSSL::PKey::RSA.generate(2048)这两个key对都将其单独的公钥和私钥保存到文件中:sys1.pub.pemsys1.priv.pemsys2.pub.pemsys2.priv.pem系统1有自己的公钥和私钥以及系统2的公钥。系统2有自己的公钥和私钥以及系统1的公钥。在系统1上,我想获取消息“Helloworld”并使用系统1的私钥和系统2的公

    10. ruby - 在 Ruby 中实现 gpg 加密 - 2

      尝试将一些旧的shell/unix脚本转换为Ruby。我对一个文件进行了以下加密,这是通过Unix中的gpg工具完成的。我可以传入接收者key、我要加密的文件和输出文件到pgp加密一些东西。gpg--recipient"$my_recipient_key"\--encrypt"$my_file"\--output"$my_outfile"\--always-trust\--compress-algozip像上面那样进行简单加密的Ruby等价物是什么?经过一些挖掘,我看到:OpenPGP很流行,但是在RubyGems网站上没有文档,其他地方也很少有很好的例子。gpgme似乎很受欢迎,很有

    随机推荐