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取出注册时后台生成的随机盐salt2String 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

torch_scatter::scatter_max 转onnx再转tensorrt踩坑记录

torch_scatter::scatter_max转onnx onnx转tensorRT 方法选择 自定义算子。在TensorRT中实现NonZero,该过程非常复杂,参考:https://blog.csdn.net/weixin_45878768/article/details/128149343

小程序开发平台源码系统——内容付费(知识付费)小程序功能 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网的发展,人们对于知识和信息的获取需求日益增长。内容付费小程序应运而生,为用户提供了一个便捷、高效的知识交易平台。小程序开发平台源码系统则为开发者提供了构建内容付费小程序的基础和工具,使其能够快速打造具有个性化…

十年磨一剑,华火电燃组合灶重磅问世,引领厨房新时代

十年磨一剑,华火研发团队经过不懈努力,成功将等离子电生明火技术与电陶炉红外线光波炉技术精妙融合,打造出的这款具有划时代是意义的电燃组合灶HH-SZQP60,终于在 2024 年6月震撼登场,该灶以其卓越的创新技术和独特的产…

VAE-pytorch代码

import osimport torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import DataLoaderfrom torchvision import transforms, datasets from torchvision.utils import save_imagefrom tqdm import tqdmclass VAE(nn.Module): # 定义VAE模型…

增值电信业务经营许可证详解

最近有很多人问小编,什么是增值电信业务经营许可证?可能大家对这个名词还很陌生,不着急!今天小编就给大家好好讲讲这个证到底是什么?为什么需要办这个这个证?它可以给企业带来什么? 带着疑问我们继续往下看。 什么…

一步步带你解锁Stable Diffusion:老外都眼馋的 SD 中文提示词插件分享

大家好我是极客菌!今天我们继续来分享一个外国人都眼馋的 SD 中文提示词插件。 那我们废话不多说,直接开整。 SD 的插件安装,小伙伴们应该都会了吧,我这里再简单讲下哦,到「扩展」中的「可下载」中点击「加载扩展列表…

LangChain资料总结

1、LangChain介绍 - 莫尔索随笔 2、LangChain 介绍 | LangChain中文网:500页中文文档教程,助力大模型LLM应用开发从入门到精通 3、🌈 Spring AI 语雀 4、AI全栈「AGI」 专栏 语雀 5、GitHub - langchain4j/langchain4j: Java version of LangChain…

国标GB/T 28181详解:国标GBT28181-2022的目录通知流程

目录 一、定义 二、作用 1、实时同步设备目录状态 2、优化资源管理和调度 3、增强系统的可扩展性和灵活性 4、提高系统的可靠性和稳定性 5、支持多级级联和分布式部署 6、便于用户管理和监控 三、基本要求 1、目录通知满足以下基本要求 2、关键要素 (1…

码农在低空经济领域的就业机遇与技能准备

在当今快速发展的经济格局中,低空经济正逐渐崭露头角,成为一个充满潜力和创新的领域。对于广大码农来说,这无疑是一片有待开拓的职业新蓝海。那么,码农们如何在低空经济中找到属于自己的就业机会呢? 首先,…

python-立方和不等式

[题目描述] 试求满足下述立方和不等式的 m 的整数解。 1^32^3...m^3≤n。本题算法如下: 对指定的 n,设置求和循环,从 i1 开始,i 递增1取值,把 i^3 (或 i∗i∗i)累加到 s,直至 s>n,脱离循环作…

docker配置redis主从复制

下载redis,复制redis.conf 主节点(6379) 修改redis.conf # bind 127.0.0.1 # 注释掉这里 protected-mode no # 改为no port 6379从节点(6380) 修改redis.conf bind 127.0.0.1 protected-mode no # 改为no port 6380 replicaof 172.17.0.2 6379 # 这里的ip为主节点容器的i…

Oracle数据库使用指南基本概念

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

代码随想录算法训练营Day36| 62.不同路径 , 63. 不同路径 II

由于我最近临近期末考试所以后面两题就先暂时跳过,但是并不是代表我不写,等我暑假会全部补起来,那么来看今天的第一题 62.不同路径:代码随想录 这道题目就是说让你求出到达终点有几种不同的路径,你只能向下或者向右走&…

介绍几种 MySQL 官方高可用方案

前言: MySQL 官方提供了多种高可用部署方案,从最基础的主从复制到组复制再到 InnoDB Cluster 等等。本篇文章以 MySQL 8.0 版本为准,介绍下不同高可用方案架构原理及使用场景。 1.MySQL Replication MySQL Replication 是官方提供的主从同…

2024.06.17校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、提前批 | 中国电科38所2024年暑期开放日暨2025届提前批招聘正式启动! 提前批 | 中国电科38所2024年暑期开放日暨2025届提前批招聘正式启动! 2、实习 | 舍弗勒实…

HarmonyOS--数据持久化

用户首选项 场景介绍 1、用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。 2、Preferences会将该数据缓存在内存中&a…

Java之使用策略模式替代 if-else

在Java中,通常情况下 if-else 语句用于根据不同条件执行不同的逻辑。而策略模式则是一种设计模式,它允许在运行时选择算法的行为。 策略模式的主要思想是将算法封装成独立的对象,使得它们可以相互替换,使得算法的变化独立于使用算…

模型情景制作-制作一棵树

情景模型中,最常用到的也是最能提升情景中生气的就是树。然而,自然的生长和环境的影响使得树的制作变成了考验制作者观察力的一道考题。制作一棵逼真的树,我们可以参考下面的这种方法。 铁丝制树 您需要准备9—12根铁丝,每根的长…

SuperCopy解决文档不能复制问题

有一些文档,我们要使用时,总是面临收费的情况,让我们不能复制,让人头疼不已!!! SuperCopy就可以解决这个问题。 获取SuperCopy步骤 1. 打开浏览器,点击右上角的三个点 2. 找到扩…

老板电器 45 年的烹饪经验,浓缩在这款烹饪大模型中

在科技不断进步的时代,人工智能(AI)迅速成为推动各行各业发展的重要力量。家电行业也不例外,根据 Gartner 的报告预测,到 2024 年,AI 家电市场的规模将达到万亿美元级别。这一预估凸显了智能化在家电行业中…