当前位置: 首页 > news >正文

【前端】关于Hash,MD5的学习

【前端】关于Hash,MD5的学习

  • Hash 的百科说明
  • Hash 的特点
  • Hash 的运用场景
    • 登陆密码加密
      • 直接使用 Hash / MD5
        • 客户端
        • 服务端
      • 再加一点东西
      • HMAC(Hash-based Message Authentication Code)

Hash 的百科说明

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。(来源百度百科解释)

  • MD5 也是 Hash 算法的一种,常见的 Hash 算法还有 sha1sha2 等。

  • MD5 也被称为信息摘要算法,由于其算法复杂不够,容易被暴力破解。

  • sha1 算法也存在和 MD5 一样的问题。

Hash 的特点

  • 算法是公开的
  • 对相同数据运算,得到的结果是一样的
  • 对不同数据运算,使用同一种加密类型,得到的密文长度是一样的;如 MD5 ,得到的结果都是 32 个字符长度的字符串
  • 这玩意没法逆运算

Hash 的运用场景

通过它的这几个特点,我们可以谈谈 Hash 它的运用场景

登陆密码加密

我们在开发的过程中首次登陆需要向服务器发送用户密码进行账户验证,但是用户的密码是非常隐私的信息,所以一定要使用加密保护。

直接使用 Hash / MD5

目前较为常见的解决方案就是使用密码的 Hashmd5 值进行验证。

客户端

直接将用户输入的密码进行 Hash 运算,得到结果发送给服务器验证。因为 Hash 算法无法逆运算,所以就算 Hash 值泄露,用户真实密码也不会泄露。

服务端

需要服务器配合,在用户注册的时候,服务端的数据库中保存的就是用户密码的 Hash 值,而不是密码本身(根据 Hash 的特点,对相同的数据加密结果是一样的)。这样就算服务器被攻克,用户的隐私信息也能起到一定的保护。

也就是现在为什么各类产品只提供重置密码的功能,而不再有找回密码的功能了。因为服务端本身也不知道用户的真实密码。

特别说明:用户的密码属于非常隐私的信息。因为大多数用户有一个特点。密码喜欢使用重复的。如果你的APP泄露了用户的密码。那么很有可能,黑客利用用户的手机号码加上密码,可以登录用户的其他应用软件,或者套出用户的支付信息,这种后果是非常严重的!

再加一点东西

上面所说的案例理论上已经非常的"安全"了。因为就算黑客知道了你的 Hash 值,也没法逆运算出用户的密码。但情况并不乐观。我们眼见为实!

MD5 为例:比如我的密码是123456MD5 的结果是:e10adc3949ba59abbe56e057f20f883e

接下来隆重介绍一个网站 www.cmd5.com/
我们只需要将 Hash 值进行反向的查询。

可能你会问,Hash 既然不能反算,为何这个网站能够查询出来?仔细看下网站的介绍不难发现:其实它是一个巨大的数据库。利用明文和 Hash 的数据记录,进行反向查询。

在这里插入图片描述

当然,提供哈希反向查询服务的不仅仅只有这个网站,还有很多盈利性的公司提供有偿服务。
所以如果我们单纯的直接使用 Hash 算法,用户的密码安全性会非常低。

早期的解决方案:加盐

let salt = '~!@#$qwerty'
pwd = pwd + salt

再进行 Hash 或者 MD5 的加密。这种方式,对于反向查询来说就比较困难了,安全系数也相对较高。

HMAC(Hash-based Message Authentication Code)

对于简单的使用盐的方式还是会有安全隐患,因为如果盐被泄露了。那么整个项目将陷入被动。因为这种方式将盐写死在程序里面了,要想今后换掉是非常难的。

那么接下来介绍一种加密方案 HMAC。它使用一个密钥,并且做了两次散列。

注意:在开发过程中,这个密钥 KEY 是从服务器获取的。并且一个用户对应一个 KEY

对于这种加密方案,就可以很好的保护用户的隐私信息,因为就算泄露了 KEY。这个 KEY 也只是一个用户的,不会污染整个项目。
如果拿到这个 KEY,然后想反查询出用户的明文密码。也是极其困难的。

所谓安全,无法做到绝对安全。他们灰产有句话:只要钱到位,没有什么不可能!我们要做到的就是相对安全,让破解的成本大于破解的利润。

—————————— 【正文完】——————————

前端学习交流群,想进来面基的,可以加群: 832485817,685486827;
前端顶级学习交流群(一) 前端顶级学习交流群(二)

写在最后: 约定优于配置 —— 软件开发的简约原则

——————————【完】——————————

我的:
个人网站: https://neveryu.github.io/neveryu/
Github: https://github.com/Neveryu
新浪微博: https://weibo.com/Neveryu
微信: miracle421354532

更多学习资源请关注我的新浪微博…好吗

相关文章:

  • gsteamer日志输出实例
  • git与ssh配置方法及注意事项
  • indiegogo/kickstarter海外众筹是什么
  • 微信公众号如何运营和管理?
  • 《大数据之路:阿里巴巴大数据实践》-第1篇 数据技术篇 -第7章 数据挖掘
  • 15万果断给?2022年郫都区高新技术企业认定奖励、时间、条件及申报流程
  • 【校招VIP】[产品][985][5分]实习经历无法凸显个人能力
  • 浅析一下,什么是股票量化机器人?
  • Pai到用时方恨少
  • GPIO端口之AFIO的完全映射与部分映射的理解
  • SpringCloud搭建微服务之Zuul网关
  • Python使用Redis计算经纬度距离
  • 可重入函数
  • ib课程北京国际学校哪里有?
  • 宠物保存服务市场现状及未来发展趋势分析
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • HomeBrew常规使用教程
  • HTTP--网络协议分层,http历史(二)
  • java概述
  • Java面向对象及其三大特征
  • js继承的实现方法
  • Redux 中间件分析
  • uni-app项目数字滚动
  • 包装类对象
  • 高性能JavaScript阅读简记(三)
  • 简单易用的leetcode开发测试工具(npm)
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • Android开发者必备:推荐一款助力开发的开源APP
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​虚拟化系列介绍(十)
  • #《AI中文版》V3 第 1 章 概述
  • #大学#套接字
  • $GOPATH/go.mod exists but should not goland
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (四)linux文件内容查看
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • @RequestBody与@ModelAttribute
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • []sim300 GPRS数据收发程序
  • [BT]BUUCTF刷题第4天(3.22)
  • [c]统计数字
  • [C++]C++入门--引用
  • [error] 17755#0: *58522 readv() failed (104: Connection reset by peer) while reading upstream
  • [Excel VBA]单元格区域引用方式的小结