关于使用软链接特性实现思源笔记本加密的一些思考

本贴最后更新于 528 天前,其中的信息可能已经斗转星移

补充说明

原文写的可能有些长,大家没耐心读完,所以下面给出的评论有些误解,就在这统一作个回复。

  • 我为什么会写这篇文章?
    • 背景:我是在开放环境中的电脑上使用思源笔记,同时又想方便快捷地在思源笔记上记录一些私密笔记。
    • 产生的需求:在同一工作空间内,能对单个笔记本进行加密。
  • 下文方案的目的
    • 鉴于现在思源笔记不支持加密单个笔记本,想到的一个变通的办法,以达到在同一工作空间内,能对单个笔记本进行加密的目的。
  • 为什么不另新建立一个新的工作空间去保存私密笔记?
    • 两个空间来回切换操作繁琐
    • 我有私密笔记双链引用非私密笔记的需求
  • 为什么要使用加密软件 VeraCrypt ?
    • 这个软件只是为了实现“加密单个笔记本”这一目的过程中使用的工具,并非我怀疑思源笔记在云端及传输过程中数据保密的安全性问题。
  • 其他软件有类似的功能吗?
    • 类似 onenote 中的分区加密的功能。

实现加密的思路

将需要加密的笔记本的对应文件夹移出 data 文件夹并使用第三方加密软件加密起来,同时利用软链接的将加密的笔记本的文件夹映射到 data 文件夹下,使思源笔记本能够在不改变工作空间的前提下加载出加密笔记本。

使用的工具

VeraCrypt:这是一款开源的加密软件,它的加密方式,是建立一个无格式的文件,软件可以将这个文件加载成一个虚拟的磁盘分区(实际使用效果类似电脑中的 C 盘、D 盘),这个加载过程需要输入密码,然后将文件放入到里面,即可实现加密。(具体见 https://www.zhihu.com/question/20023600/answer/198270485

加密笔记本的步骤

  1. 使用 VeraCrypt 加载一个加密的虚拟磁磁盘分区 F 。

  2. 将 data 下要加密的笔记本整个文件夹一起剪切到 F 盘中。

  3. 使用软链接“mklink /d 软连接文件 原文件夹”的方法,将 F 盘中的笔记本文件夹映射到 data 文件夹下

  4. 打开思源笔记,此时由于虚拟磁盘 F 分区是被加载的,所以思源可以打开加密的笔记本。

  5. 在 VeraCrypt 中卸载掉虚拟磁盘 F 分区,由于 F 盘已不存在,所以思源也就不可以读取到加密笔记本的内容,并显示出如下提示信息,点击重建索引,加密笔记本在文档树下消失。

    image.pngimage.png

❤️ 本方案需要思源笔记提供的支持

我在测试此方案的过程中遇到了如下两个问题,需要思源支持。

第一个问题:思源笔记不识别加密笔记本的软链接

即使在 data 中成功创建加密笔记本的软链接,思源笔记不能够感知到这个加密笔记本的软链接,但是同样是在 data 下 assets 文件夹用同样的方法创建的软链接就能被思源笔记识别到。

🙏 所以我建议 data 下的笔记本文件夹也能像 assets 文件夹那样能被思源笔记识别到。

第二个问题:消除文件历史等造成的加密笔记泄露的因素

根据我的使用经验,可能造成加密笔记本数据泄露的地方有三处:数据快照、文件历史、corrupted 文件夹。

数据快照:由于数据快照可以在 syncignore 上设置忽略加密笔记本的快照创建,所以数据快照这一块应该不会造成加密笔记的泄露。

文件历史:文件历史这一块现阶段是会造成加密笔记的泄露。因为被删除的笔记本及其笔记文档操作历史记录都会放在工作空间目录下的 history 文件夹,并且其内容是人类可读,可手动恢复的。

🙏 所以建议笔记本的历史记录也能像资源文件夹 assets 那样可以建立笔记本级的 history 文件夹。

至于 corrupted 文件夹,它好像是用来储存损坏笔记文件的???在我测试中,通过故意破坏笔记本文件夹中的文件,发现思源会对笔记本文件夹中的文件进行判断,只要是笔记本文件夹中有 .siyuan 文件夹,且其内有文件名为 conf.json 的文件(只要满足文件名是 conf.json 就行,内容有无或瞎写都不用管),思源就不会自动删除此笔记本文件夹,否则就会删除并将其移到 corrupted 文件夹中,所以这个文件夹在某些特定情况会造成数据泄露。

🙏 所以建议 corrupted 文件夹也能像资源文件夹 assets 那样可以建立笔记本级的 corrupted 文件夹。

总结

由于我从未学习过任何编程语言,所以上面的想法可能多少有些天马行空、纸上谈兵,还请 D 大多多包涵。

但因为思源本地数据明文储存的特性,而用户在使用过程中又确实有加密笔记的需求,因此我认为通过软链接搭桥,将一部分笔记内容交由第三方专业的加密软件保密来实现同一工作空间内某个笔记本加密的思路是一种可行的折中处理的办法,只是实现的方案还劳烦 D 大费心从专业的角度去分析制定。

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    18704 引用 • 69828 回帖
1 操作
wxtgood 在 2022-11-15 00:16:29 更新了该帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 这个已经在 Issue #6548 · siyuan-note/siyuan 上讨论过了,我提的疑问你还没有回复我哦。

    1 回复
  • 你提出的“这个如果要支持的话应该是整个工作空间路径而不只是 data/笔记本 ID/ 路径吧?否则会有泄漏”这个疑问,我其实是没有完全理解的。

    所以我在上文中的第二个问题中“消除文件历史等造成的加密笔记泄露的因素”中尝试回答了,不知道理解的正不正确。

    1 回复
  • 不只是这些文件夹,还有基本的配置文件也要考虑,所以我觉得需要整个工作空间都加密才能确保没有泄漏。

    1 回复
  • 我感觉的现在这个方案是否可行的矛盾是不是出现在了:对于“泄露”这个尺度是如何把控的问题上了。

    我认为大部分用户加密笔记的目的是为了不被别人看到笔记记录的文字内容,至于笔记的其他属性,比如建立的时间,使用的模板表情等是不需要被加密的,所以若是其他的基本的配置文件中没有包含笔记的文字内容,则可以考虑将其放弃加密。

    目前我了解到的 data 文件夹下的子文件的作用:

    • .siyuan 文件夹:目前我的这个文件夹下只有 syncignore 文件,它里面应该是不包含笔记的文字内容的。
    • 笔记本文件夹 ID 文件夹:这个文件夹用第三方加密软件加密起来。
    • assets 文件夹:可以通过建立笔记本级的 assets 文件夹来一起加密。
    • emojis 文件夹:放表情的,应该不包含笔记文字内容。
    • storage 文件夹:目前我的这个文件夹下只有 local.json 文件,里面的内容看不懂,但看了一下,好像只是包含了些笔记中的标签名称,没看到具体的笔记内容。
    • templates 文件夹:放模板的,应该不包含笔记文字内容。
    • widgets 文件夹:放挂件的,应该不包含笔记文字内容。

    conf 文件夹:能力有限,实在看不懂 😂 ,它是否包含了笔记的具体文字内容???

    history 文件夹:希望能支持笔记本的历史记录也能像资源文件夹 assets 那样可以建立笔记本级的 history 文件夹。

    repo 文件夹:设置忽略加密笔记本的快照创建

    temp 文件夹:能力有限,实在看不懂 😂 ,它是否包含了笔记的具体文字内容???

    所以我的理解:对于“泄露”这个尺度是如何把控,我觉的即使有人获取了笔记本及笔记文档的一部分参数,也是应该推不出具体笔记内容的,因此对于不包含笔记文字内容的的一些配置文件可以舍弃加密。

    1 回复
  • 既然是为了安全,那为什么不直接加密整个工作空间?

    1 回复
  • 首先来讨论第一个问题“为了安全”。

    我觉的这里“为了安全”中的“安全”换为“保密”更合适些。

    首先保密是一项非常耗费资源的事情,所以保密从来都不是绝对性、一次性的,而是有针对性的,也就是说这个秘密是针对谁进行保密的,并且保密级别应该是与这个人对你的秘密的感兴趣程度和解密能力及泄密后对你的影响三方面成正相关,比如说我和我家的母鸡,在一个夜黑风高的夜里我独自一人将一颗价值连城的夜明珠埋在了墙角,但第二天即使我面对面告诉母鸡,我把夜明珠藏在了哪里了,我也不怕,为什么?因为母鸡只关心我家米缸藏在哪了,即便有一天母鸡对我的夜明珠感兴趣了,我也不怕,因为我把珠子埋了九九八十一米深,到目前还没有哪只鸡刨过这么深的坑。

    我不知道思源未来的发展会不会往记录商业机密这些更高级别的领域发展,但就目前的用户群体来看,都是一些你我他身边的普通人,想要保密的东西也就是些骂老板小气又怕老板看见的话,再就是些密码之类的内容,而且针对的保密人群也就是些你我他身边的普通人,解密能力有限。

    我确实看不懂你说的这些“基本配置文件“中是否包含有笔记的文字内容,就先假设不包含吧,在这个假设的前提下使用 VeraCrypt 保护起来的笔记数据应该是非常安全的,听说巴西毒枭就是用他保护数据的,连 FBI 也没有破解开。

    接着来讨论为什么不直接加密整个工作空间

    直接加密整个工作空间一定是最安全的保密手段,但生活中的事很多的事都是不易取极端的,直接加密整个工作空间是最繁琐的,如何能在安全和便利找到一个平衡点,这才是解决问题方法。

    “直接加密整个工作空间”繁琐的地方体现在:

    1. 若我准备只用一个工作空间来记录非保密和保密内容话,那首先面临的问题便是我要用预先用 VeraCrypt 创建多少 GB 的容器空间去放笔记数据呢,若创建的小了,可笔记数据一直在变大,若创建的大了,VeraCrypt 加载的时候就慢多了。而且这样云同步就不能用了。
    2. 若我准备创建了两个工作空间,一个记录非保密的内容,一个记录保密的内容,并且只加密需要保密的那个工作空间,但这样一来,两个空间来回切换的繁琐、两个空间的内容不能相互引用双链的烦恼就来了。

    但若使用上文中的方案,安全和便利之间就能找到一个比较恰当的平衡点了:

    只建一个工作空间,非保密的笔记本内容,仍用云同步进行同步,而保密的内容放在 VeraCrypt 建立的容器文件里,此时 VeraCrypt 的压力就小多了,建立一个 1G 的容器文件足够放保密的内容的了。在需要打开加密笔记本的时候使用 VeraCrypt 将容器文件加载成虚拟磁盘分区,思源里重建索引即可打开加密笔记本。在 VeraCrypt 中设置多长时间无文件写入自动卸载虚拟磁盘分区即可在规定时间后自动关闭加密笔记本,最后通过百度云同步容器文件。

    这样既保证了一个工作空间内同时能记录加密和非加密笔记,又能进行云同步。

    当然说到底,上文的方案都是建立在能排除“文件历史 history 文件夹、corrupted 文件夹”不造成笔记内容泄露,以及你说的这些“基本配置文件“中没有包含有笔记的文字内容。

    2 回复
    1. 你提到的仅加密笔记本不用预设大小吗?在文件系统上笔记本和工作空间都是文件夹,对于加密软件来说有什么区别吗?
    2. 既然你不考虑使用多工作空间,那么单工作空间完整加密的弊端是?
    1 回复
  • zuoez02 1 评论

    就算你映射成功了,这个映射之后的 data 目录,其他软件如果还能读的话,不也是没有保证其机密性的吗?要不然思源也没办法访问这些文件了吧。

    这块机密性在于应该是除了思源的软件,其他程序都无法获取到内容本身,也就是所有文件都经过了特殊的加密方式,简单做个 AES 加密都可以,而密钥由用户或程序自己管理,其他程序也不能获取到,才能保证其机密性。

    思源笔记目前我用起来的习惯是开着就会一直开着不会关闭,毕竟每次开启都要同步还是比较慢的了,而且断网的话启动都费劲,不知道其他人的使用方式是怎样的。所以这种需要启动的时候开启映射使用起来太麻烦了还是。

    更正一下,现在最新版本开启挺快的了,不过我没测断网的情……
    zuoez02
  • 我不认为这是一个明智的选择。

    其一,大材小用

    参见所描述的“但就目前的用户群体来看,都是一些你我他身边的普通人,想要保密的东西也就是些骂老板小气又怕老板看见的话,再就是些密码之类的内容,而且针对的保密人群也就是些你我他身边的普通人,解密能力有限”,那么我认为,在低级加密需求上直接使用锁屏,参加这个;在高级加密需求下,使用全工作空间加密。总之,如无必要,勿增实体。

    其二,技术难度

    不同系统上支持软链接的方式各有不同,如果再考虑到移动平台更是麻烦,siyuan 的资源文件之所以能实现软连接是因为资源文件的读取可以调用通用系统功能,但是为了实现笔记文件的动态加载等功能,笔记文件的读取必须 siyuan 自己实现。更何况你所希望的不是仅仅涉及本地文件的加密解密,更是包括云同步这种云端内容。

    其三,bug 引入

    对于思源这样一个复杂的应用而言,特性并不是越多越好,因为功能特性越多,出错的可能就越大。更何况你所需要的内容涉及到笔记读写操作的改造,那么在极端情况下可能会损坏本地的所有笔记文件,而且是目前对于笔记丢失的通用挽救方案——数据历史都无法恢复的。

  • yjmsiyuan

    新建加密工作空间即可

    1 回复
  • 滴链是个友善交流的平台。有部分用户提需求,证明他真的有需求。不能因为自己没有需求而否定别人的需求

    onenote 就有单个文件夹的加密。好久没用印象和有道,好像他们也有

    加密功能不是第一次提出的建议,相信这次也不是最后一次

    勿怼,love and peace

    1 回复
  • 在回答这两个问题之前,我们先来聊一下 VeraCrypt 创建的加密容器文件特性,这个容器文件为了更好地保密文件,在 VeraCrypt 将其卸载后,外界软件根本感知不到、分析不出其内部数据的变化情况,所以在使用云盘对其进行同步时,类似坚果云增量同步的方式是行不同的,只能每次重新上传,进行全量同步。

    现在回答第一个问题:

    仅加密笔记本也是需要考虑预设大小的。

    但正文中的方案是鉴于思源笔记自身单个笔记本加密功能的缺失,而找到的一种无奈的替代办法,因此在实践本方案时需要对加密的内容进行取舍,即加密的笔记本中尽量只写文字,这样就能使预设的大小控制在 1GB,甚至 500M 就够用了,这个大小对 VeraCrypt 解密时的压力也小,用百度云全量同步时的压力也小。

    回答第二个问题:

    在不考虑使用多工作空间的情况下,单工作空间完整加密的弊端:

    1. 本不需要加密的内容也需要记录在这个加密的工作空间里,而这些不需要加密的笔记内容就杂了,有图片、PDF,这样一来的话就需要将 VeraCrypt 创建的加密容器文件预设大下变的很大,对 VeraCrypt 解密时的压力也就变的很大,对百度云全量同步时的压力也变的很大。
    2. 意味着完全放弃官方的云同步和 webdav 等各式同步方式,只能本地或者网盘每次全量同步。
    3. 由于加密的是整个工作空间,本不需要被加密的笔记和需要被加密的笔记就处于同一空间了,而对于有随时记录要求,本不应被加密的笔记本来说,就需要 VeraCrypt 将容器文件一直保持在解密的状态,这就增加了加密笔记被别人看到的机率。比如在给别人展示一些笔记内容时,无意间被别人看到了加密笔记,又比如尽管思源自带锁屏(访问授权码),但却不能设置隔多长时间无操作后自动锁屏,离开电脑时忘记手动锁屏后,就会造成别人看到加密笔记的可能。
    1 回复
  • 不新建加密工作空间的原因,具体详见我和 D 大在评论区中的讨论。

    image.png

  • 非常感谢理解 🙏 。

    onenote 的分区加密功能确实很好用。

  • 88250 1 1 赞同 1 评论

    这个使用场景不考虑支持了,抱歉抱歉。

    1 回复
    类似问题直接推荐 cryptomator 即可
    deerain 1
  • 好吧,还是挺遗憾的。

    但还是想表达一下,对于在开放环境中的电脑上使用思源笔记,同时又想方便快捷地在思源笔记上记录一些私密笔记的用户,对能给单个笔记加密这个需求是存在的,期望思源能在未来某个时段考虑一下这些用户的需求。

请输入回帖内容 ...