背景

  1. 对于一个系统来说,显然把用户的密码明文存储是大忌,那么必然要加盐加密存储。
  2. 在登录注册过程中,密码显然不能明文传输,那么必然会用https来做登录注册接口。
  3. 但是 https 并不是绝对安全的,经常用抓包工具调试软件的就会明白,虽然条件苛刻,但是也能实现中间人攻击,那么为了安全,应该在浏览器或者客户端把密码先做加密处理(MD5),即使被中间人攻击了,也不会泄露密码。Link
  4. 那么问题来了,对于后端开发人员来说,客户端是不能被信任的,如果采用MD5或其他摘要算法,后端是无法对密码强度进行检验的,如何解决这个问题?

实验环节

为了解决这个问题,我首先对几个知名网站的注册进行抓包,看看他们是怎么处理这个问题的 (截图丢失这里暂时只放结论)
  1. 阿里云账户: https + 明文密码
  2. 微软账户: https + 明文密码
  3. 百度个人中心: https + 某种未知加密
  4. 微信公众平台: https + MD5
  5. 谷歌账户:https + 明文密码

分析思考

  1. 上述5个网站中百度的最有意思,从密文上没看出来是何种加密方法,密文长度和密码长度趋势相反,引起了我的好奇,于是提取js观察,原来用了RSA算法,这种非对称加密传输密码,确实能保证密码被可靠的传输到后端,这个过程和https传输对称加密密码过程是一样的,除非这个黑客黑到极致,不仅成功做了中间人攻击,还顺手把百度的那个js给改成了他自己的一套,用户注册的密码被中间人解密后再用真正的百度的那个js加密请求给百度后端(从这个角度考虑,只要中间人存在,就不存在绝对的安全,就算用了Hash加密密码,中间人捕获到你的md5密文,来伪造请求登录,登陆成功过后还不是可以为所欲为,如果杠精说阿里、微软谷歌的都不安全,微信公众平台和百度才叫真正的安全,那么大可怼回去,这只不过是五十步笑百步,在中间人面前,皆是蝼蚁)。
  2. https 的可靠性还是被认可的,毕竟对https进行中间人攻击,条件是很苛刻的,如果是浏览器,会给你提示证书错误,阻止你的访问,如下图。如果是自己开发的客户端,ssl证书的认证过程也是可控的。
  3. 回到题目,如果使用https + 密码明文进行注册,服务端自然可以检验密码强度,除了担心安全,没什么好纠结的。
  4. 如果使用https + md5进行注册,服务端无法检验密码强度,那么能自己绕过前端验证的,必然都是搞技术的开发者或者黑客(正经人谁 TM 使 Postman 注册),黑客注册一个脆弱的账户自己用的话,其意义跟注册一个密码强度高的账户没区别,系统安全的要求都是防止恶意用户越权访问。如果黑客注册一堆脆弱的账户给别人用,其依然没意义,既然是黑客注册的,密码简单和复杂没区别,因为黑客完全掌握。因此也没什么好纠结的。
  5. 如果使用RSA非对称加密进行注册,服务端可以解密得到密码明文,从而检验密码强度,密码没有在https加密下明文传输(这话说着别扭),心理好受,又担心非对称加密代价比较大,其实注册不是一个高并发的场景,在网关层面做好防护,防止流量攻击即可。因此也没什么好纠结的。

总结起来,为了屁事少,前端做个密码强度校验,然后https请求到服务端,服务端对密码加盐增加密码长度,以sha或者md5的形式存储到数据库即可。如果你作为不受信任的服务提供商,为了充分保护用户隐私(避嫌),大可在https请求之前,做个MD5哈希,服务端不接触用户用户的明文密码,就不会有因为日志等因素泄露用户隐私的风险!

其实我有考虑能否使用同态加密,但是没研究过其可行性,只是设想客户端传输了服务端不可解的密文,服务端又能判断密码强度,然后服务端存储这个不可解的密文,这样就能做到md5形式的避嫌,又能做到不传输明文,还可以在服务端校验密码强度,全部痛点都解决了(除了开发者肝疼)

用户注册密码加密和后端校验的权衡相关推荐

  1. ss修改服务器加密方式,SSM框架新增/修改用户、用户登录时密码加密处理及校验...

    加密技术Md5Crypt需要在pom文件中导入包: commons-codec commons-codec 1.10 一.第一种实现方法 1).新增用户时,对新增后的用户密码进行加密 在userSer ...

  2. Edusoho修改注册的用户密码加密机制规则

    一.简介 1.修改生成$salt的机制规则. 2.修改生成$password的机制规则. 二.edusoho的默认用户密码加密机制规则 1.系统默认生成$salt的方式: edusoho\src\Bi ...

  3. Express接口综合案例(创建项目、配置常用中间件、路由设计、提取控制器模块、配置错误统一处理中间件、用户注册的数据验证,密码加密)

    一.创建项目 二.目录结构 三.配置常用中间件 3.1 解析请求体 express.json() express.urlencoded() 3.2 日志输出 morgan() 3.3 为客户端提供跨域 ...

  4. 青橙商城13 用户名密码加密、用户注册+验证码

    1.用户名密码加密 2.用户注册+验证码 首先定义一个输入手机然后就返回验证码给你: 然后定义控制层调用上面的接口: 添加用户: 就是用户注册时,点击手机注册, 会输入手机,然后发送验证码,那么我们就 ...

  5. PHP密码问题陈婷代码_登录中利用JS前端加密PHP后端解密保证数据非明文传输的安全方法...

    为什么要研究这个呢,因为我所在单位的信息管理部门在监控系统上发现有大量的明文账号(身份证号)和密码在传输,被告知这很不安全,索性就直接解决这个问题,利用JS前端加密PHP后端再加密来解决这个问题,保证 ...

  6. 前后端交互,密码加密,RSA 实现前端 js 加密,后端 go 解密

    RSA 加密算法简介 一种比较常见的非对称加密算法,常用于前后端交互中的密码加密,前端使用公钥加密密码,后端使用私钥进行解密.公钥可对外开放,私钥是存放在服务端,外部正常情况下是拿不到解密私钥的. 以 ...

  7. uni-app项目实现用户注册密码前端页面加密

    uni-app项目下引入crypto-js.js实现密码加密 一.HBuilder 安装 crypto-js.js 视图==>显示终端==> cd 进入项目根目录 例如:demo\test ...

  8. 用户密码的加密解密操作(前端加密,后端解密)

    用户密码的加密解密操作 作者是个小菜狗,行文过程基本都基于自己理解,没有深入查阅文献,如有错误,还请大神指出 背景: 公司做的是一个某某平台的系统,包括前台和后台,作者刚毕业,刚开始试用,带我的师傅让 ...

  9. 密码的前端加密与后端解密

    一前端vue加密 #安装依赖 npm install jsencrypt#公钥加密密码 import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'const ...

最新文章

  1. OpenGL模板 Mac Cmake OpenGL(Glut) Template
  2. java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?
  3. Ubuntu下python升级pip(ImportError: cannot import name 'main')
  4. leetcode171
  5. 多继承-注意父类之间注意不要有重名方法或属性
  6. python操作json字符串,超详细的Python文件操作知识
  7. 大型网站技术架构(四)--网站的高性能架构(转)
  8. 初中数学最全几何模型_老师熬夜整理:初中数学最全几何模型大汇总,学生大呼“过瘾”...
  9. 半年成java大佬_通过自学60天成为java大佬 第一天 知识点总结 数据类型
  10. 西安科技大学计算机学院保研,独臂姑娘,好样的!
  11. 行为型模式之 状态模式
  12. 视频分享:做“有料”的计算机大学生
  13. js获取post请求参数_SpringMVC请求参数获取时,有这六种方式值得学习
  14. 4019 设备树 Linux device tree 概述
  15. easyui datagrid一般创建模板
  16. 软件工程专业英语翻译【考研复试】
  17. 线下娱乐“换血”,沉浸式体验会成为下一个10年的主题吗?
  18. oracle e18,ORACLE_10g_各版本下载地址大全
  19. 清橙A1206 小Z的袜子(莫队算法)
  20. 计算机硬件 OR CX 1,计算机硬件复习提纲

热门文章

  1. 独立和不相关 区别及形象理解
  2. 全新线控制动系统产品发布,清智科技正式完成业务拓展
  3. uniapp canvas画板
  4. [python] 输出第n小的质数
  5. linux终端能显示中文,但是不能输入中文的解决方法
  6. 阿尔法小蛋机器人热点密码_科大讯飞阿尔法小蛋智能机器人使用说明
  7. 【zotero】从知网万方维普WOS等数据库上导出格式引文-引文格式到zotero中
  8. 2018王鼎杯-fakebook-详细解说
  9. AltiumDesigner 19软件安装步骤
  10. ADI DSP的寄存器详细说明在哪里?