我已经阅读了一堆关于客户端密码学如何不是一个好主意的答案和教程,因为主要在Javascript Cryptography Considered Harmful文章中列出了许多原因。一些事实
- 该应用程序将使用 HTTPS
- 将有服务器和客户端验证
- 用户密码与以下场景之间没有联系
- 服务器端是一个 RESTful Web 服务(没有任何会话)
- 后端向用户发布 JWT
- 后端可能同时允许用户/密码以及 oauth(即 fb、twitter 等)
我想在客户端加密什么?
用户将通过前端应用程序(即 Vue.js、Angular、React 等)输入一些个人信息(即姓名、地址、电话号码)。
我怎么想象这会起作用?
用户选择字段(即个人信息的点点滴滴),然后点击加密。用户将提供一个加密密钥。前端将使用一些js crypto library
加密信息替换它们DOM
并通知用户备份加密密钥。
如何将此信息传达给服务器?
前端将向服务器发出带有个人信息(无论是纯文本还是乱码)的 HTTPPUT
或POST
请求。服务器不关心传入的数据(即除了sql或其他形式的注入)并立即将其存储在数据库中。此请求将不包含encryption key
但是,可能包含一个标志以指定哪些字段已加密。
如何解密?
当用户请求信息时,后端会按原样返回服务器中的任何内容。如果加密的信息将显示gibberish
给用户。使用标志,系统将为他们提供decrypt
选项并单击将要求他们输入encryption key
并在本地进行解密。
终极目的?
首先,将尽一切努力确保服务器和数据库以及一切都是防弹的,但是,如果由于某种原因服务器被黑客入侵,那么黑客最终会得到大量与胡言乱语的个人信息相关的信息。
终极问题
Javascript
强烈建议不要通过互联网阅读密码学,因此,我的问题
- 考虑到上述场景和要求,上述实施有哪些风险?
- 您是否推荐一种方法,只有用户可以控制密钥,而不是存储在任何地方?
- 如果我要在后端加密此信息,我如何
encrypt key
与用户进行安全通信?也许使用密钥加密信息xyz
,然后为用户提供一个安全链接以单击并查看xyz
加密密钥,...? - 对于前端、基于后端的加密,还有哪些其他建议?
我想让用户相信只有他们知道如何解密密钥。我怎样才能以更有效的方式实现这一目标?无需存储和管理加密密钥?
2018 年 7 月 17 日更新
根据接受的答案,我写了一篇关于我如何实现解决方案的中等帖子是链接https://medium.com/@rhamedy/encryption-decryption-of-data-based-on-users-password-using- pbkdf2-aes-算法-592f8c1bb79a