千早Tihaya
708 字
4 分钟
一个简单的基于AES加密存储的个人记账系统
NOTE本项目所有源代码已在以下 Github 仓库中开源:
Waiting for api.github.com...
一些基本想法
验证密码
密码当然不能直接明文判等于,太过于愚蠢了。故考虑到 AES 的巧妙之处,利用以下方法来验证密码是否正确:
- 初始化:假定密码为 ,利用 为密钥加密字符串
Password is correct.,可以得到密文 。将 直接储存到后端代码常量中。 - 密码验证:利用用户输入的密码 为密钥,加密字符串
Password is correct.,若结果与 相等则密码正确。
CAUTION注意,以上全程不涉及到 的明文存储。故若源代码被泄露,即使有了 也无法逆向得到 ,较为安全。
不要穷举了,我的密码十几位有英文有数字,整不出来的,而且我的 vercel 免费套餐流量是有限的。。。
解密数据
当然,数据也不能直接明文存储,这样太过于愚蠢了。同时,为了防止有人能搞到我数据库权限直接读,加密也需要一定的手段:
- 当能解密数据时,则之前的密码验证已通过。此时可以保证输入密码 等于原始密码 。故为了在代码中不体现 的明文,我们利用 对数据进行加密解密。
- 另外,考虑到网络波动导致部分数据错误,故需要对此进行特判,防止错误解密的数据在存储时替换掉原有正常数据。
一些风险
- 用户输入的 直接明文传输到服务器,如果不走 https 走的是 http 容易泄露。但是我们伟大的 vercel 给我了 https
- 本项目利用 AES‑ECB,也没加盐,理论上并不是很安全。但是如果有人能给这玩意破解了估计也得耗不少精力,你都这么累了,我账本给你看得了。
所以其实没啥风险我感觉,密码设长一点别让人暴力破解了就行。
如何使用此项目
绑定数据库
超级无敌简单,整一个 vercel 的数据库,然后绑定到你要部署的项目,要求数据库类型为 Upstash for Redis,免费套餐就够用了。
随后,检查项目的环境变量中是否存在:
KV_REST_API_URLKV_REST_API_TOKEN
存在就代表绑定成功了。
修改密码
按照验证密码的方法,在 transactions.js 文件里面修改 EXPECTED_CIPHER 即可,这个变量就是 。
NOTE貌似已有数据后再修改密码会关于解析数据的bug,我以后再修,因此,建议一开始部署的时候就决定一个长期使用且不修改的密码。
以上,具体代码实现看我仓库。
一个简单的基于AES加密存储的个人记账系统
https://blog.mitufun.top/posts/一个简单的基于aes加密存储的个人记账系统/