【问题标题】:Reading encrypted blob file from database without storing it从数据库中读取加密的 blob 文件而不存储它
【发布时间】:2016-03-02 05:24:29
【问题描述】:

我想将 pdf、word、excel (...) 文件作为 BLOB 数据存储到 sqlite 数据库中,然后检索它以使用第三方应用程序打开。

因为这些文件是机密文件,我不希望它们在阅读时存储在手机中。 (如果手机被偷了,我不希望陌生人访问文件)

我有什么选择?

【问题讨论】:

    标签: android sqlite android-studio privacy


    【解决方案1】:

    我不希望它们在阅读时存储在手机中

    从技术上讲,您无法控制它。欢迎第三方应用对数据进行任何操作,包括将其保存到文件、通过 Internet 共享等。

    欢迎您写一个ContentProvider 流式传输您的文档以响应openFile()。在您的情况下,由于内容不是文件,因此您需要使用ParcelFileDescriptor 管道,因此您可以将数据写入OutputStreamThis sample project 演示了基本技术,尽管我从资产提供 PDF。

    不过,如果您在处理较大的文档时遇到问题,我不会感到惊讶。客户端应用程序可能希望在流中向前和向后搜索,而管道不会导致可搜索的流。

    【讨论】:

    • 在本例中,文件存储在 Asset 文件夹中......另外,我虽然 ParcelFileDescriptor 需要创建一个 URI? URI 是使用已存储到特定位置的文件生成的,我想避免这种情况
    • @Jaythaking:“文件存储在 Asset 文件夹中”——是的。我在回答中提到了这一点。 “我虽然 ParcelFileDescriptor 需要创建一个 URI?” -- 客户端有一个Uri 并使用ContentResolveropenInputStream() 来读入内容。 “URI 是使用已经存储到特定位置的文件生成的”——为了与其他书籍示例保持一致,我碰巧使用了它。您可以将 Uri 路径设置为您想要的任何路径,只要您知道如何将其映射到所需的数据库条目即可。
    • 你有书或任何网站可以建议我在哪里使用数据库作为 ContentResolver 的输入?我在这里有点迷路,因为那里没有太多这样的例子......
    • @Jaythaking:我不知道有一个openFile()。有很多数据库 ContentProvider 示例,但它们主要用于数据库 API(query()insert()update()delete())。很少有人会走 put-large-docs-in-a-BLOB-column 路线。您可能会考虑使用 IOCipher,而不是滚动您自己的数据库中的加密文档实现。
    • @Jaythaking:“还有其他解决方案吗?” - 除了使用库自己渲染这些文件之外,我不知道。主要限制是使内容可供任意第三方应用程序使用。您必须使用这些应用程序所期望的协议。 “2016 年的最佳实践是什么?” ——嗯,大多数开发人员并不担心它,依赖于设备加密和内部存储的内在安全性。如果我站在你的立场上,我会使用 IOCipher,就像之前建议的那样。
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2013-10-06
    • 2021-04-02
    相关资源
    最近更新 更多