一种不需要密码的加密方法(用于防止网盘扫描等场景)

2022-01-12 11:28:28 +08:00
 SuperMild

安全与便利总是难以兼顾,记忆密码或管理密码,加密或解密时输入密码等操作如果能彻底免除,会非常便利,但是安全性也自然会降低。

幸好,日常生活中有些场景本身就不要求很高的安全规格,只需要稍稍加点防护就足够了。

比如上传到网盘,只要不被轻易扫描、或者万一泄露文件时让人看着一堆乱码不乐意花时间精力去解密,就足够了。

因此,我想到了把密钥直接内嵌到密文里的方法,从此不需要记忆或管理密码,因为密码就在密文里,解密时也不需要填写密码,用脚本自动化提取密码就可以解密了,方便到极致!

当然,该方法只适用于大多数普通文件,不适用于真正的机密。

听起来不靠谱?(原理)

其实很靠谱,因为:

  1. 一般人根本想不到密码就在密文里
  2. 就算想到了,也不知道具体位置
  3. 如果我把一个密钥拆成 3 段,分别镶嵌在不同位置,就更难猜了
  4. 如果我把密钥拆成 N 段,并且调换顺序后再镶嵌进密文里,你还乐意去猜吗?

而加密解密却很方便,不需要记住密码,因为程序可以自动化提取密钥。

即便如此,当然还是不适用于真正的机密,但日常大多数文件这样处理已经足够安全了。

开源脚本

不久之前我做了一个命令行工具框架,用来管理零散的脚本,这个加密脚本也是其中的一个插件。

安装框架的方法看这里: https://github.com/ahui2016/ffe/blob/main/docs/usage.md (简单来说,pip install ffe 就可以了,要求 python 3.10+)

安装了 ffe 之后,用以下命令安装这个加密解密脚本:

ffe install -i https://github.com/ahui2016/ffe/raw/main/recipes/mimi.py

如果遇到网络问题,也可以使用 gitee 地址:

ffe install -i https://gitee.com/ipelago/ffe/raw/main/recipes/mimi.py

最后安装依赖 pip install cryptography (只依赖这一个第三方库)

使用方法

可见,加密解密过程都不需要输入密码。

使用命令 ffe dump -r mimi file.txt > mimi.toml 可以生成一个 mimi.toml 文件,以后可以使用命令 ffe run -f mimi.toml 来执行相同的任务,这对于需要经常重复的操作来说是很方便的。而且,在 toml 文件里还可以添加别的任务(比如打包压缩),一次性依次执行一系列任务。

关于 ffe

ffe 是一个命令行插件框架,可以用 Python 来写插件,多个插件可组合使用,适合用来管理零散的脚本。后续我还会发帖介绍我写的插件,比如免费上传文件到云端。多个文件组合后,使用一个命令 ffe run -f <toml file> 即可一次性执行打包、加密、上传,toml 文件的编辑也很直观。

9072 次点击
所在节点    分享创造
154 条回复
SuperMild
2022-01-12 19:24:06 +08:00
@takato Steganography 会导致文件体积增大很多吧?我对这方面了解不多。
wooyuntest
2022-01-12 19:30:20 +08:00
使用 gpg ,密钥使用 yubikey 等 gpg 智能卡管理。
xinghen57
2022-01-12 19:48:20 +08:00
@SuperMild 买个 vps ,做个 vpn 连家里 nas 。
8M 带宽腾讯轻量云 3 年不到 200 。
xinghen57
2022-01-12 19:53:51 +08:00
@SuperMild 网盘不可信。所以别存。
泄露只是一方面,你没法知道他们对加密内容的处理。
如果泄漏可以,做彩虹表卖钱有啥不可?如果有关部门有需求,很多你以为不会做的其实也会做的。

其实,大部分你觉得重要的都没那么重要。真正重要的,比如银行卡密码之类的东西。

换个思路,你用国外的如 Dropbox ,即便泄漏,如果没法对你产生影响,也无所谓。
keith1126
2022-01-12 21:36:59 +08:00
这个帖子读下来,再次印证了密码学是一个不适合自己造轮子的领域。
msg7086
2022-01-12 21:45:42 +08:00
试过用文件名本身作密码吗?
SuperMild
2022-01-12 22:02:17 +08:00
@xinghen57 “大部分你觉得重要的都没那么重要。真正重要的,比如银行卡密码之类的东西”

非常同意,所以我这个工具主要是用来稍稍加强一下隐私而已,不是用来加密重要资料的。用来临时存放资料,并且有 api ,并且免费、不需要登记信用卡,并且不用翻墙可以直连的国外网盘我已经找到了,过几天我也会写文章介绍。


@msg7086 文件名太容易不小心修改了,而且也极容易被猜到(上面就有人有类似的想法:文件名+密码,但如果一堆文件,每个文件名都跟着几个字符,而这一堆文件都是加密文件,很难不去尝试一下用文件名去解密啊)
msg7086
2022-01-12 22:09:00 +08:00
@SuperMild 不是加密码,就只是文件名。
比如说你要压缩一个 银行卡.rar ,那你就用「银行卡.rar 」当密码。
文件名被修改这个暂且先不管。
parametrix
2022-01-12 22:21:57 +08:00
这样做的话,真正的密钥实际上就是原密钥拆分的方法以及镶嵌的位置。我们可以把原密钥拆分的位置按顺序记录为一个 N 位数组,镶嵌的位置按顺序记录为另一个 N 位数组,这样就完全确定了一个 2N 位的新密钥。

所以实际上这是一个固定密钥的加密,考虑到被加密文件的大小,以及密钥长度,新密钥的熵可能很有限(一些组合数的求和),所以不如直接:

openssl enc -aes-256-gcm -k fixedpassword
SuperMild
2022-01-12 22:39:18 +08:00
@parametrix 有一个重点:当破解者拿到一个加密文件时,在他眼中,这只是平平无奇的加密文件,他并未获得 “密钥就在密文中” 这个信息。

另一方面,我这套方法只是加一层防护,防扫描,不妨特殊针对,在这种情况下,我想获得“完全不用理会密码”的便利。结果,我获得了便利,也真能防住普通扫描,这就很好啊。

并不是任何时候都需要高强度加密的,也有稍稍加一层比较薄的防护就够的情形,我针对这种情形,故意降低安全性,换取了完全不用管密码的爽感。(也不用担心一个密码泄露就影响其他,也不用担心一个特殊密码会忘记,也不用管理密码,我知道密钥永远和密文在一起,这让我很安心,我有信心解密。同时,撒网捕鱼的破解者却不知道 “密钥就在密文中” 这个信息。)
SuperMild
2022-01-12 22:48:29 +08:00
@msg7086 明白,但我觉得不安稳,文件名被修改的问题不得不考虑,整个文件名就是密码其实也很常见,这个安全性太低了。

其实把密钥嵌进密文也非常常见,这个做法本身必然被很多人想到过,但好处是花样比较多,具体怎么镶嵌可以搞得步骤很简单却很难猜。同时,由于是自己的思路,总能记得个大概方向。

也就是说,安全性既不会太低,也兼顾了便利性。
crazytec
2022-01-13 00:33:01 +08:00
为什么不直接用空文件+密钥延伸生成密钥?这样即使脚本丢了也不会丢失数据,同时也可以防止网盘之类的扫描
Johndo3
2022-01-13 01:03:18 +08:00
echo "password" | sha256sum
Adelell
2022-01-13 02:00:24 +08:00
楼主莫非是张同学本尊?
Asvel
2022-01-13 02:50:50 +08:00
既然是靠记住镶嵌方式的话,用这种方法和用「镶嵌方式的描述」(比如那几行关键代码)直接做密码有什么区别,反正你记得住。
VZEXEZVzzz
2022-01-13 03:57:40 +08:00
楼主脚本的核心概念就是方便吧,那为什么不 alias enc=任意一个固定密钥加密呢?

费功夫多写几行代码,多装几个类库的意义又何在呢?

假如想推广给更多的人用,他们得克隆仓库,安装 Python ,安装依赖,有什么能够让人们觉得方便的点呢?怎么看都不如用各种操作系统都自带的加密工具包写个小脚本方便吧
AX5N
2022-01-13 04:22:52 +08:00
这也太弱智了

实际上相当于用同一个密钥以 aes256 的方式加密了所有的文件,别人确实没办法破解 aes256 ,但是只要拿到你的密钥(你的脚本)就相当于破解了所有的文件。

我直接用现成的加密解密算法还可以省去维护代码的精力,直接用脑子记住一条密钥就行了。成本比你小,安全性还略高(因为我的密钥是记在脑子里,你的密钥是存在电脑上)。
cache
2022-01-13 07:42:18 +08:00
你这不是加密,是重新编码
等效于把记一个密码变成了记一种编码方式
SuperMild
2022-01-13 08:15:49 +08:00
@crazytec 空文件,包括上面有人说的用生日之类的,我担心网盘已经可以自动破解了,因为这需要很简单的改进。

而我这种方法,简单的改进也是破解不了的。

@Johndo3 用生日、手机号码、简单密码生成密钥,有可能被升级版的扫描程序破解,扫描者如果想做这个,非常轻松,对吧?


@Asvel 原因很简单:记住一行代码的全部细节,比记住逻辑随时实现相同的功能,对于我来说,后者可以记得更久更牢。
SuperMild
2022-01-13 08:22:28 +08:00
@VZEXEZVzzz 我不想管理密钥啊。太简单的密钥,包括上面有人说用生日,破解者只要稍稍升级一下扫描程序就可以破解,我怀疑现在网盘已经升级了,因为这个升级实在太轻松了。

而复杂的密钥,又要管理。我这个是完全不用管密钥的。


@AX5N “只要拿到你的密钥(你的脚本)”…… 你不能这样说啊,不管我用什么方法加密,只要被别人拿了密钥,当然可以破解我全部文件。如果你用这个理由来说,那正常的加密不也是一样“只要拿到你的密钥(你的脚本)”就被破解了?

简单的密钥,或者常用的密钥是能记住,但我很不愿意用简单的密钥(因为太容易被升级版扫描程序破解了),而复杂密钥,很难记,我记住镶嵌方式非常容易。

也许有人记复杂密钥更轻松,但也有人记镶嵌方式更轻松,人与人不一样,你不能随便说谁更弱智吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/827768

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX