聊一聊日记内容加密的事儿
前言
隐私日记本终于更新了梦寐以求的日记内容加密功能,借着这个机会,站在技术角度上跟大家聊一聊隐私日记本加密的事。阅读本文不需要具备技术基础。
保存账号密码
首先想想和大家聊聊,账号密码在隐私日记本的存储方式。遵循业界技术惯例,隐私日记本不会在数据库以及操作日志中存储用户的明文密码。
数据库存储的,是根据用户递交的密码所生成的一个独一无二的一段文本。
用户每次登录,都会用密码重新生成一段文本,并与数据库在用户注册时生成并存储的文本对比,若一致,则表示用户密码正确。而这段新生成的文本,是无法反推用户原密码的。
隐私日记本在业界惯用的密码散列函数及加盐之外,还额外增加了独有的干扰混淆,让密码破解难度更高(比如用散列碰撞的办法)。因此只要保证自己的电脑本身干净安全(比如不安装破解软件,只在官方网站下载应用程序),完全可以放心大胆的使用私人常用密码,无需担心泄露风险。
接下来,聊聊本次更新的主菜:日记内容加密。
日记内容加密
隐私日记本采用的,是使用【用户密码】作为加密钥匙,对日记内容进行加解密。因为服务器不存储用户的密码,因此就算服务器被黑客攻击,并泄露了日记数据(任何网络服务都无法保证信息不被泄露),黑客(包括站长在内)也无法解密日记原内容。
使用用户密码解密日记,会面临两个技术问题:
1、用户修改密码怎么办?
初级程序员可能会想到这个办法:修改密码时,先用老密码将用户所有日记解密,再用新密码将所有日记加密。
这是一个有效的办法,不过如果用户量和日记数量庞大的时候,数据库的性能问题就会暴露出来。而且还会牵扯到下面第二个问题,用户忘了密码时,日记就永远无法找回了。
隐私日记本采用的办法,是在用户注册时,自动随机生成一个长度非常长的不可见私有密码,并用这个私有密码去加密日记内容,再拿用户密码去加密这个私有密码。
这样用户每次登录时,仅解密这个私有密码就可以了。
所以,每次修改密码的时候,仅仅用老密码解密私有密码,并用新密码重新加密私有密码。大功告成。
2、用户忘了密码怎么办?
思路也很简单,用户找回密码,需要填写安全问题,那么我们只要用这个安全问题作为密码,去加密私有密码,并单独存储起来,这就是【安全私有密码】。
当用户找回密码时,用安全问题的答案来解密【安全私有密码】,并用新密码加密,再替换原私有密码,就可以了。
给其他开发者
如果你恰巧也想用这个思路实现加解密,请不要忘了安全问题和答案也需要像用户密码一样进行散列加密哟。☺️