708 字
4 分钟
一个简单的基于AES加密存储的个人记账系统
2026-08-23
NOTE

本项目所有源代码已在以下 Github 仓库中开源:

MituFun
/
Bill
Waiting for api.github.com...
00K
0K
0K
Waiting...

一些基本想法#

验证密码#

密码当然不能直接明文判等于,太过于愚蠢了。故考虑到 AES 的巧妙之处,利用以下方法来验证密码是否正确:

  • 初始化:假定密码为 PP,利用 PP 为密钥加密字符串 Password is correct.,可以得到密文 CexpectC_{expect}。将 CexpectC_{expect} 直接储存到后端代码常量中。
  • 密码验证:利用用户输入的密码 PP' 为密钥,加密字符串 Password is correct.,若结果与 CexpectC_{expect} 相等则密码正确。
CAUTION

注意,以上全程不涉及到 Key\text{Key} 的明文存储。故若源代码被泄露,即使有了 Result\text{Result} 也无法逆向得到 Key\text{Key},较为安全。

不要穷举了,我的密码十几位有英文有数字,整不出来的,而且我的 vercel 免费套餐流量是有限的。。。

解密数据#

当然,数据也不能直接明文存储,这样太过于愚蠢了。同时,为了防止有人能搞到我数据库权限直接读,加密也需要一定的手段:

  • 当能解密数据时,则之前的密码验证已通过。此时可以保证输入密码 PP' 等于原始密码 PP。故为了在代码中不体现 PP 的明文,我们利用 PP 对数据进行加密解密。
  • 另外,考虑到网络波动导致部分数据错误,故需要对此进行特判,防止错误解密的数据在存储时替换掉原有正常数据。

一些风险#

  1. 用户输入的 PP' 直接明文传输到服务器,如果不走 https 走的是 http 容易泄露。但是我们伟大的 vercel 给我了 https
  2. 本项目利用 AES‑ECB,也没加盐,理论上并不是很安全。但是如果有人能给这玩意破解了估计也得耗不少精力,你都这么累了,我账本给你看得了。

所以其实没啥风险我感觉,密码设长一点别让人暴力破解了就行。

如何使用此项目#

绑定数据库#

超级无敌简单,整一个 vercel 的数据库,然后绑定到你要部署的项目,要求数据库类型为 Upstash for Redis,免费套餐就够用了。

随后,检查项目的环境变量中是否存在:

  • KV_REST_API_URL
  • KV_REST_API_TOKEN

存在就代表绑定成功了。

修改密码#

按照验证密码的方法,在 transactions.js 文件里面修改 EXPECTED_CIPHER 即可,这个变量就是 CexpectC_{expect}

NOTE

貌似已有数据后再修改密码会关于解析数据的bug,我以后再修,因此,建议一开始部署的时候就决定一个长期使用且不修改的密码。


以上,具体代码实现看我仓库。

一个简单的基于AES加密存储的个人记账系统
https://blog.mitufun.top/posts/一个简单的基于aes加密存储的个人记账系统/
作者
MituFun
发布于
2026-08-23
许可协议
CC BY-NC-SA 4.0