1、加密算法-MD5随机盐

一、说明

MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要(32位的数字字母混合码)。

二、主要特点

不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一样

(一个MD5理论上的确是可能对应无数多个原文的,因为MD5是有限多个的而原文可以是无数多个。比如主流使用的MD5将任意长度的“字节串映射为一个128bit的大整数。也就是一共有2128种可能,大概是3.4*1038,这个数字是有限多个的,而但是世界上可以被用来加密的原文则会有无数的可能性)

MD5的性质:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的(相当于超损压缩)。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(伪造数据)非常困难。

5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

虽说MD5有不可逆的特点;但是由于某些MD5激活成功教程网站,专门用来查询MD5码,其通过把常用的密码先MD5处理,并将数据存储起来,然后跟需要查询的MD5结果匹配,这时就有可能通过匹配的MD5得到明文,所以有些简单的MD5码是反查到加密前原文的。
为了让MD5码更加安全,涌现了很多其他方法,如加盐。 盐要足够长足够乱 得到的MD5码就很难查到。

三、使用场景

1.防止被篡改

  • 比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。

  • 比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。

  • SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

2.防止直接看到明文

现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被激活成功教程的难度。)

3.防止抵赖(数字签名)

这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

四、密码增强

MD5 加盐(salt)和不加盐在安全性上有着显著的差异。MD5 是一种哈希算法,用于将任意长度的输入数据转换为固定长度的输出(通常为128位的哈希值)。然而,MD5 在设计时就存在一些安全性问题,例如碰撞攻击,即两个不同的输入可以产生相同的输出哈希值。

因此,MD5 不再被推荐用于安全敏感的应用,如密码存储。

原理

加盐是指在输入数据之前,先添加一个随机的、唯一的字符串(即“盐”)。这个盐在哈希计算过程中与输入数据一起被哈希。加盐的主要目的是增加哈希值的唯一性,使得即使两个输入数据相同,只要它们的盐不同,生成的哈希值也会不同。这可以显著降低碰撞攻击的可能性。

  • 增加唯一性:通过使用不同的盐,即使两个用户输入了相同的密码,它们的哈希值也会因为盐的不同而不同。这使得暴力破解和字典攻击变得更加困难。

  • 防止彩虹表攻击:彩虹表是一种预先计算的哈希表,用于快速查找密码的哈希值。加盐使得每个用户的哈希值都是独一无二的,彩虹表无法直接应用到每个用户的具体情况。

  • 增加计算成本:加盐增加了计算哈希值的步骤,因为每次哈希计算都需要处理不同的盐。这在一定程度上增加了破解的计算成本。

实战

步骤逻辑处理方说明
1用户注册:md5(密码和固定盐salt1混排)=>md5pwd1前端防止密码明文传输
2用户注册:生成随机盐salt2,md5pwd2 = md5(md5pwd1+salt2)、随机盐存库后台二次md5
3用户登录:用户输入密码后做md5(密码和固定盐1混排)=>md5pwd1前端保持密码加密传输
4用户校验:根据用户id取出注册时的md5pwd2、salt2后台取出注册的md5pwd2、salt2
5用户校验:将取出的salt2+前端处理的md5pwd1,加密后与db数据做一致性比对后台加密结果比对

代码

package com.bj58.spider.contentfeedpost.abtest;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Scanner;

public class PasswordUtils {

    /**
     * 生成16位随机盐,再通过base64加密成字符串
     */
    public static String generateSalt() {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[16];
        random.nextBytes(salt);
        return Base64.getEncoder().encodeToString(salt);
    }

    /**
     * 密码加密
     *
     * @param password 原始密码
     * @param salt     存在db中的随机盐
     * @return 密码
     */
    public static String encryptPassword(String password, String salt) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(salt.getBytes());
            byte[] hashedPassword = md.digest(password.getBytes());
            return Base64.getEncoder().encodeToString(hashedPassword);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 密码核验
     *
     * @param password       密码
     * @param salt           db中的随机盐
     * @param hashedPassword 前端通过md5(原始密码+固定salt)得到的pwd
     * @return
     */
    public static boolean checkPassword(String password, String salt, String hashedPassword) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(salt.getBytes());
            byte[] hashedInput = md.digest(password.getBytes());
            String hashedInputString = Base64.getEncoder().encodeToString(hashedInput);
            return hashedInputString.equals(hashedPassword);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return false;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入一个密码:");
        String pwd = scanner.nextLine();
        System.out.print("请输入一个固定盐:");
        String salt1 = scanner.nextLine();
        // 用户注册
        // 前端的第一次md5加密只是为了不明文传输,实际怎么混排、加密、加盐都和后台无关
        String md5pwd1 = String.format("MD5(%s)", pwd + salt1);// 我为了测试方便,先随便写一个加密,哈哈
        System.out.println(String.format("1.用户注册:密码:%s,固定盐:%s,得到第一次加密的md5 = %s,将加密的md5pwd1传给后台", pwd, salt1, md5pwd1));
        // 后台准备第二次md5加密,先生成一个随机盐做加密,存db,再对前端加密后的pwd,做md5加密
        String salt2 = generateSalt();
        String md5pwd2 = encryptPassword(md5pwd1, salt2);
        System.out.println(String.format("2.用户注册:密码:%s,随机盐:%s,得到第二次加密的md5 = %s,将加密的md5pwd2和salt2存入db", md5pwd1, salt2, md5pwd2));

        // 用户登录
        //前端不管怎么处理,都必须要保持md5加密一致性,不同场景都是一样的加密值
        String md5pwd1Param = md5pwd1;
        // 根据用户id取出注册时后台生成的随机盐salt2
        String dbSalt = salt2;
        String result = checkPassword(md5pwd1Param, dbSalt, md5pwd2) + "";
        System.out.println(String.format("3.用户登录:前端密码:%s,db中的密码:%s,db中随机盐:%s,比对结果:%s", md5pwd1Param, md5pwd2, dbSalt, result));
    }

}

在这里插入图片描述

总结

  • 防止密码泄露是多层次的,要从数据上报=》存储都尽可能考虑到
  • MD5加盐的算法实现包括hash有很多,但是核心流程基本上一样
  • 抛开有人提过极致的暴力破解和db层加密串覆盖,不管从哪个层次看基本上开发和黑客都在短时间无法拿到原始密码
  • 很遗憾,md5从原理上看,很多文章还是说有缺陷,我个人感觉最危险的就是前端的md5加密,虽然也加盐了,但是厚度好像还是不够,还是得继续搜素其他的加密策略才行

参考资料

  • https://cloud.tencent.com/developer/article/2107970
  • https://blog.51cto.com/u_16213353/7560254?share_token=961D7FD8-3412-48C8-B89E-126B2BBF81D1&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_ios&utm_campaign=client_share&wxshare_count=1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/750845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用容器配置文件构建任意应用镜像_并将应用镜像推送到公共仓库共享_应用分享与启动---分布式云原生部署架构搭建012

上面我们编写好了应用,并且,安装好了redis 现在我们把应用打包成镜像. 以前是这样做的,不方便,因为需要在服务器上,安装jdk什么的,现在有了 镜像就不用,给服务器安装镜像什么的了 以后所有机器都安装docker以后,就直接运行就可以了 首先看一下,安装java应用,需要 用到openjd…

送物机器人电子方案定制

这是一款集娱乐、教育和互动于一身的高科技产品。 一、它的主要功能包括: 1. 智能对话:机器人可以进行简单的对话,回答用户的问题,提供有趣的互动体验。 2. 前进、后退、左转、右转、滑行:机器人可以通过遥控器或AP…

ThreadX简介

文章目录 1. 摘要2. ThreadX的特性2.1 免费开源2.2 安全认证级别高2.3 组件完善2.4 实时性高2.5 支持多核2.6 支持应用动态加载2.7 代码符合MISAR规范2.8 文档全面,例程丰富2.9 集成方便3. 移植示例4. 产品应用示例1. 摘要 在嵌入式系统领域,实时性能、系统稳定性以及广泛的…

ODYSSEE加速电机仿真优化

由于对低碳社会的强烈需求,电动汽车(EV)和混合动力汽车(HEV)的数量正在迅速增长。新能源汽车的主要部件是电池、逆变器和电机。电机市场的规模也将不断扩大。为了提高EV的性能,对电机设计工程师的要求越来越高。 除了EV市场,协作机器人市场也…

TextRank 算法

第1关:Jieba 在关键词提取中的应用 任务描述 本关任务:根据本关所学有关使用 Jieba 库进行关键词提取的知识,编写使用 Jieba 模块进行关键词提取的程序,并通过所有测试用例。 相关知识 为了完成本关任务,你需要掌握…

全国公共汽车、出租车拥有情况及客运量、货运量数据

基本信息. 数据名称: 全国公共汽车、出租车拥有情况及客运量、货运量数据 数据格式: Shp、Excel 数据时间: 2020-2022年 数据几何类型: 面 数据坐标系: WGS84 数据来源:中国城市统计年鉴 数据可视化. 2022年全年公共汽车客运总量数据示意图 2022年公路客…

MGV电源维修KUKA机器人电源模块PH2003-4840

MGV电源维修 库卡电源模块维修 机器人电源模块维修 库卡控制器维修 KUKA电源维修 库卡机器人KUKA主机维修 KUKA驱动器模块维修 机械行业维修:西门子系统、法那克系统、沙迪克、FIDIA、天田、阿玛达、友嘉、大宇系统;数控冲床、剪板机、折弯机等品牌数控…

使用插件和微调优化 GPT 模型

文章目录 LLM 用例和示例产品警惕 AI 幻觉:限制与考虑使⽤插件和微调优化 GPT 模型 OpenAI 在其网站上展示了许多激励人心的客户故事,我们需要了解这些模型如何改变我们的社会并为商业和创造力开辟新机遇。正如你将看到的,许多企业已经开始使…

华宽通中标长沙市政务共性能力建设项目,助力智慧政务建设新飞跃

在数字化浪潮的推动下,长沙市政府正积极拥抱智慧城市建设,以科技力量提升政务服务效能。华宽通凭借其卓越的技术实力与丰富的项目经验,成功中标长沙市政务共性能力建设项目,这无疑是对华宽通在智慧城市领域实力的高度认可。 华宽…

Psychtoolbox 脑电实验范式之mp4视频绘制

1. 读取 首先需要使用到Screen(‘OpenMovie’)函数,该函数可以读取mp4、gif格式的数据,具体方式如下: clear; clc; Screen(Preference, SkipSyncTests, 1); screens Screen(Screens); screenNum max(screens); [window, screenRect] Scr…

【pytorch09】数学运算

1.数学操作 add/minus/multiply/dividematmulpowsqrt/rsqrtround 2.加减乘除 加法 矩阵乘法 torch.mm 只适用于2d torch.matmul 要分清楚是矩阵元素相乘,还是矩阵相乘 例子 x一共有4张照片,每张照片打平成784的向量,希望降维得到[4,51…

CDGA数据治理:数字化时代的基石

随着数字化浪潮的汹涌而来,数据已成为当今世界的核心驱动力。无论是企业决策、市场趋势预测,还是个性化用户体验,都离不开数据的支撑。而在这一过程中,数据治理的重要性日益凸显,成为实现数字化转型、发挥数据价值的最…

el-form-item的label设置两端对齐

<style scoped> ::v-deep .el-form-item__label {display: inline;text-align-last: justify; } </style>需要给两个form设置同样的label-width <el-form-item label"信号机名称" label-width"75px"><el-input type"text" …

计算机组成原理——存储器

1. 主存储器 1.1. 概述 1.1.1. 主存的组成 主存由存储芯片组成。主存由半导体集成电路组成。半导体是“原材料”,集成电路是“加工技术”,存储芯片则是利用这种技术制造出来的、具有特定功能(数据存储)的“产品”。驱动器、译码器和读写电路均制作在存储芯片中而 MAR、MD…

隐秘而又复杂的恶意软件:SSLoad

SSLoad 是一种隐秘的恶意软件&#xff0c;主要通过钓鱼邮件打开突破口&#xff0c;收集各种信息再回传给攻击者。近期&#xff0c;研究人员发现 SSLoad 通过诱饵 Word 文档投递恶意 DLL 文件&#xff0c;最终部署 Cobalt Strike。另一种攻击方式是利用钓鱼邮件诱导受害者到 Azu…

上古世纪战争台服官网地址+台服预约+预创建角色教程

上古世纪战争台服上线啦&#xff0c;在《上古世纪战争》中&#xff0c;通过主要势力和地区&#xff0c;剧情和角色可以想起原作。《上古世纪战争》的主要背景为&#xff0c;原大陆消失之后&#xff0c;完成移民的种族们定居在诺伊大陆之后遇到的多个势力之间的冲突。同时&#…

解决删除快照后启动虚拟机显示指定的文件不是虚拟磁盘 打不开磁盘“路径”或它所依赖的某个快照磁盘。 模块“disk”启动失败。 未能启动虚拟

今天删除虚拟机无用的快照的时候突然发现k8s集群的一台虚拟机打不开了并且也不能返回快照 报错如下 指定的文件不是虚拟磁盘 打不开磁盘“e:\1.虚拟机\vm2\centos 7 64 位-cl1-000003-s019.vmdk”或它所依赖的某个快照磁盘。 模块“disk”启动失败。 未能启动虚拟机。 找了很多…

【从0实现React18】 (五) 初探react mount流程 完成核心递归流程

更新流程的目的&#xff1a; 生成wip fiberNode树标记副作用flags 更新流程的步骤&#xff1a; 递&#xff1a;beginWork归&#xff1a;completeWork 在 上一节 &#xff0c;我们探讨了 React 应用在首次渲染或后续更新时的整体更新流程。在 Reconciler 工作流程中&#xff…

未来一周比特币价格及数字货币市场预测

荷月的比特币市场就像过山车一样&#xff0c;仅仅六月下旬就跌去-12%&#xff0c;本周更是暴跌-6%&#xff0c;至 58,378美元。在这种市场表现&#xff0c;应有的踩踏如期而至。德国政府今日宣布再出售750 比特币的行为继续打击多头&#xff0c;但是小编认为这恰恰预示着市场可…

简化收支记录,只留关键日期! 一键掌握财务流动,高效管理您的每一笔收支

在繁忙的生活中&#xff0c;管理个人或家庭的财务收支变得尤为重要。然而&#xff0c;传统的记账方式往往繁琐且复杂&#xff0c;让人望而却步。今天&#xff0c;我们为您推荐一款简洁易用的记账神器——晨曦记账本&#xff0c;让您轻松记录收支&#xff0c;只显示日期&#xf…