MD5 加密
任务:
接到一个任务,调用对方的接口,内容和密码,需要使用md5进行加密,再发送请求。
参数说明:
参数名称 | 说明 | 备注 |
timespan | 时间戳 | 格式为yyyyMMddHHmmss |
pwd | 密码 | 此处用原始密码+时间戳做MD5加密,32位大写格式 |
msgfmt | 编码类型 | 选填,如果不填默认为GBK,可以选填GBK或者UTF8/UTF-8 |
content | 内容 | 做base64编码操作,编码方式使用msgfmt中的方式,如果msgfmt有值的话 |
处理:
bast64编码处理:
md5
import org.apache.commons.codec.digest.DigestUtils;public class Md5Utils {/*** @param text 明文* @param key 密钥* @return 密文*/public static String md5(String text, String key) throws Exception {// 加密后的字符串String md5str = DigestUtils.md5Hex(text + key);System.out.println("MD5加密后的字符串为:" + md5str);return md5str;}/*** 直接加密* @param text 明文* @return* @throws Exception*/public static String md5(String text) throws Exception {// 加密后的字符串String md5str = DigestUtils.md5Hex(text);System.out.println("MD5加密后的字符串为:" + md5str);return md5str;}/*** 直接加密后变成大写* @param text 明文* @return* @throws Exception*/public static String md5Upper(String text) throws Exception {// 加密后的字符串String md5StrUp = DigestUtils.md5Hex(text).toUpperCase();System.out.println("MD5加密后大写的字符串为:" + md5StrUp);return md5StrUp;}public static void main(String args[]) throws Exception {String currentTimeSuffix = DatesUtils.getCurrentTimeSuffix();String pwd = "042556";md5(pwd, currentTimeSuffix);String pwdStr = "04255620230525112132";String pwdMdStr = md5Upper(pwdStr);System.out.println(pwdMdStr);}
}
时间处理
DatesUtils
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class DatesUtils {private static String datePattern = "yyyy-MM-dd";private static String dateHourPattern = "yyyy-MM-dd HH";private static String dateTimePattern = "yyyy-MM-dd HH:mm:ss";private static String dateTimePatternSSSXXX = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";private static String dateTimeSuffixPattern = "yyyyMMddHHmmss";private static String zeroTime = " 00:00:00";private static String endTime = " 23:59:59";public static String format(Date date, String pattern) {if (date == null)return "";return DateFormatUtils.format(date, pattern);}public static String format(Date date, String pattern, TimeZone timeZone) {if (date == null)return "";return DateFormatUtils.format(date, pattern, timeZone);}public static String formatDate(Date date) {if (date == null)return "";return DateFormatUtils.format(date, datePattern);}public static String formatDate(Date date, TimeZone timeZone) {if (date == null)return "";return DateFormatUtils.format(date, datePattern, timeZone);}public static String formatDateTime(Date date) {if (date == null)return "";return DateFormatUtils.format(date, dateTimePattern);}public static String formatDateTime(Date date, TimeZone timeZone) {if (date == null)return "";return DateFormatUtils.format(date, dateTimePattern, timeZone);}public static Date parseDate(String str) {if (StringUtils.isBlank(str))return null;try {return DateUtils.parseDate(str, datePattern);} catch (ParseException e) {e.printStackTrace();}return null;}public static Date parseDateTime(String str) {if (StringUtils.isBlank(str))return null;try {return DateUtils.parseDate(str, dateTimePattern);} catch (ParseException e) {e.printStackTrace();}return null;}public static Date parseDateTime(String str, String dateTimePattern) {if (str == null)return null;try {return DateUtils.parseDate(str, Locale.CHINESE, dateTimePattern);} catch (ParseException e) {e.printStackTrace();}return null;}public static Date formatDateTimeZero(Date date) {String formatDate = formatDate(date);return parseDateTime(formatDate + zeroTime);}public static Date formatDateTimeEnd(Date date) {String formatDate = formatDate(date);return parseDateTime(formatDate + endTime);}public static Date getCurDateTime() {Date date = new Date();String curDate = DateFormatUtils.format(date, dateTimePatternSSSXXX);return DatesUtils.parseDateTime(curDate, dateTimePatternSSSXXX);}public static Date getFirstOfHour(Date date) {String formatDate = format(date, dateHourPattern);return parseDateTime(formatDate + ":00:00");}public static Date getLastOfHour(Date date) {String formatDate = format(date, dateHourPattern);return parseDateTime(formatDate + ":59:59");}public static Date getFirstOfDay(Date date) {String formatDate = format(date, datePattern);return parseDateTime(formatDate + zeroTime);}public static Date getLastOfDay(Date date) {String formatDate = format(date, datePattern);return parseDateTime(formatDate + endTime);}/*** 获取指定日期所在月的第一天* @param date 日期* @return 所在月的第一天*/public static Date getFirstOfMonth(Date date) {//获取当前月第一天:Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.MONTH, 0);calendar.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天return formatDateTimeZero(calendar.getTime());}/*** 获取指定日期所在月的第最后一天* @param date 日期* @return 最后一天*/public static Date getLastOfMonth(Date date) {//获取当前月最后一天Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));return formatDateTimeEnd(calendar.getTime());}/*** 获取当年的第一天*/public static Date getCurrentFirstOfYear() {Calendar currCal = Calendar.getInstance();int currentYear = currCal.get(Calendar.YEAR);return getFirstOfYear(currentYear);}/*** 获取当年的最后一天*/public static Date getCurrentLastOfYear() {Calendar currCal = Calendar.getInstance();int currentYear = currCal.get(Calendar.YEAR);return getLastOfYear(currentYear);}/*** 获取某年第一天日期* @param year 年份* @return Date*/public static Date getFirstOfYear(int year) {Calendar calendar = Calendar.getInstance();calendar.clear();calendar.set(Calendar.YEAR, year);return calendar.getTime();}/*** 获取某年第一天日期* @param date 日期* @return Date*/public static Date getFirstOfYear(Date date) {int year = Integer.parseInt(String.format("%tY", date));return formatDateTimeZero(getFirstOfYear(year));}/*** 获取某年最后一天日期* @param year 年份* @return Date*/public static Date getLastOfYear(int year) {Calendar calendar = Calendar.getInstance();calendar.clear();calendar.set(Calendar.YEAR, year);calendar.roll(Calendar.DAY_OF_YEAR, -1);return calendar.getTime();}/*** 获取某年最后一天日期* @param date 日期* @return Date*/public static Date getLastOfYear(Date date) {int year = Integer.parseInt(String.format("%tY", date));return formatDateTimeEnd(getLastOfYear(year));}/*** 计算两个日期之间的时间差,到秒* @param start 开始日期* @param end 结束日期* @return Long*/public static Long getDiffDatesToSec(Date start, Date end) {long startTime = start.getTime();long endTime = end.getTime();return (endTime - startTime) / 1000;}public static Date addDay(Date start, Integer day) {Calendar calendar = Calendar.getInstance();calendar.setTime(start);calendar.add(Calendar.DATE, day);return calendar.getTime();}public static Date addMonth(Date start, Integer month) {Calendar calendar = Calendar.getInstance();calendar.setTime(start);calendar.add(Calendar.MONTH, month);return calendar.getTime();}public static Long getRemainMilOneDay(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DAY_OF_MONTH, 1);calendar.set(Calendar.HOUR_OF_DAY, 0);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);calendar.set(Calendar.MILLISECOND, 0);Long seconds = (calendar.getTime().getTime() - date.getTime());return seconds;}public static Long getDiffDays(Date start, Date end) {Long day = (parseDate(formatDate(end)).getTime() - parseDate(formatDate(start)).getTime())/ (1000 * 60 * 60 * 24);return day;}public static String getCurrentTimeSuffix() {Date now = new Date();return format(now, dateTimeSuffixPattern);}public static void testDifSec() {System.out.println("=========before year=========");Date beffore = parseDateTime("2012-10-10 12:00:00");Date after = parseDateTime("2012-10-10 12:00:50");Long diffDatesToSec = getDiffDatesToSec(beffore, after);System.out.println(diffDatesToSec);}public static void main(String args[]) {String format = getCurrentTimeSuffix();System.out.println(format);}
}
请求内容处理:
public void sendNoticeConent(JSONObject userInfo, String content){ String pwd = MapUtils.getString(userInfo, "pwd");String timespan = DateUtils.getCurrentTimeSuffix();MultiValueMap<String, String> params= new LinkedMultiValueMap<>();params.put("pwd", Collections.singletonList(Md5Utils.md5(pwd, timespan)));params.put("timespan", Collections.singletonList(timespan));params.put("content", Collections.singletonList(Base64Utils.encode(content))); params.put("msgfmt", Collections.singletonList("UTF-8")); // 跟encode保持一致// 发送请求}
总结:
MD5(Message Digest Algorithm 5)是一种常用的哈希算法,用于将任意长度的数据转换为固定长度的哈希值。它具有以下特色特点:
1、不可逆性:MD5算法是一种单向哈希函数,即无法通过哈希值反推出原始数据。这意味着即使知道哈希值,也无法直接得到原始数据的内容。因此,MD5被广泛应用于密码存储等场景,增加了数据的安全性。
2、高速性:相对于其他哈希算法,如SHA-1或SHA-256,MD5算法具有较高的计算速度。这使得MD5在处理大量数据时能够提供较快的计算效率,适用于需要频繁计算哈希值的场景。
3、固定长度输出:MD5算法的输出固定为128位的哈希值,无论原始数据的长度如何,输出都是固定长度的。这为比较和存储哈希值提供了方便,同时也为验证数据完整性提供了基础。
4、广泛应用:由于MD5算法的特点,它被广泛应用于数据校验、密码存储、数字签名等领域。例如,在网络传输中,可以使用MD5校验和来验证文件的完整性;在用户登录系统时,可以使用MD5加密存储密码,增加密码的安全性。
5、容易实现:MD5算法的实现相对简单,算法流程清晰明了。这使得开发人员能够轻松地将MD5算法集成到自己的应用程序中,提供数据的哈希计算和校验功能。
需要注意的是,由于MD5算法存在一些安全性问题,如碰撞攻击和彩虹表破解等,它已经不再被推荐作为密码存储的安全选择。在安全敏感的场景中,建议使用更强大的哈希算法,如SHA-256。
相关文章:

MD5 加密
任务: 接到一个任务,调用对方的接口,内容和密码,需要使用md5进行加密,再发送请求。 参数说明: 参数名称 说明 备注 timespan 时间戳 格式为yyyyMMddHHmmss pwd 密码 此处用原始密码时间戳做MD5加…...

在 Excel 中将列数据用单引号括起来并添加分隔符的解决方案
在 Excel 中,有时候我们需要将某一列的所有值连接在一起,并且每个值用单引号括起来,同时在每个值之间添加逗号和空格。这样的需求在数据处理和导出时比较常见。本文将介绍一种使用 Excel 函数解决这个问题的方法。 解决方案: 方…...

技术硬实力,阿里巴巴为什么要开源Spring Cloud Alibaba?
Spring Cloud Alibaba是阿里巴巴开源的一款高性能的微服务RPC框架,关于Spring Cloud Alibaba的详细介绍我这里就不啰嗦了,大家可以参考官网及相关源码,我这里只是想聊的是“阿里巴巴为什么要开源Spring Cloud Alibaba”,只要追根朔…...

2024 前端高频面试题之 HTML/CSS 篇
【前言】随着市场的逐渐恶劣,通过总结面试题的方式来帮助更多的coder,也是记录自己的学习过程,温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化?2、块级元素&内联样式3、盒子模型的理解&…...

实现将信息作为txt,pdf,图片的形式保存到电脑~
PrintableUtils作为输出信息的工具类: package org.example; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.pdf.PdfWriter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; im…...

服务器变矿机,该如何应对?
开始 恶意的挖矿程序会导致服务器cpu的异常占用,很让人讨厌。起初,我只是使用top命令显示出占用cpu不正常的进程,发现其中一个进程占用了百分之九十九点几,然后通过kill -9 <PID>命令干掉它。但总是过不了几天,…...

2018年认证杯SPSSPRO杯数学建模A题(第一阶段)海豚与沙丁鱼全过程文档及程序
2018年认证杯SPSSPRO杯数学建模 探究海豚猎捕时沙丁鱼群的躲避运动模型 A题 海豚与沙丁鱼 原题再现: 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗,所以在距离较远时,海豚只能使用回声定位方法来判断鱼群的整体位置…...

【Webpack】预处理器 - 常用loader介绍
选用合适的loader来处理不同的资源和不同的功能,以下是一些主流的loader,但这并不是全部,因为每时每刻都可能有新的loader 发布到 npm上 babel-loader babe-loader 用来处理ES6并将其编译为ESS,它使我们能够在最新的工程中使用最…...

lodash 的 _.groupBy 函数是怎么实现的?
说在前面 🎈lodash的_.groupBy函数可以将一个数组按照给定的函数分组,返回一个新对象。该函数接收两个参数:第一个参数是要进行分组的数组,第二个参数是用于分组的函数。该函数会对数组中的每个元素进行处理,返回一个值…...

(2024,ViM,双向 SSM 骨干,序列建模)利用双向状态空间模型进行高效视觉表示学习
Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0.摘要 3. 方法 3.1. 基础知识 3.…...

docker容器和常用命令
1.什么是容器 容器是隔离的环境中运行的一个 进程 , 如果进程结束 , 容器就会停止. 细致: 容器的隔离环境 , 拥有自己的 ip 地址 , 系统文件 , 主机名 , 进程管理 , 相当于一个 mini的系统 2.容器 vs 虚拟机 3.Docker极速上手指南 #1.安装相关依赖. sudo yum install -y …...

【征服redis9】快速征服lua脚本
lua脚本,这个名字总让人想歪,不过老外发明名字,我们只能跟着叫了。这个脚本语言在redis里和Nginx里都有用,所以我们就来看一下。 目录 1 lua的介绍与说明 2 lua的基本语句体验 3.Lua的数据结构和高级特性 1 lua的介绍与说明 …...

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变
vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格: 子…...

GBASE南大通用分享,如何修改可信上下文
在以下示例中,假设该可信上下文对象 appserver 存在并启用。以下的 ALTER TRUSTED CONTEXT 语句将 appserver 可信上下文对象的对象方式重置为 DISABLE。当其处于该方式时, appserver 可信上下文仍然存在,但是它不能用于存取数据库服务器。 …...

冻结Prompt微调LM: T5 PET (a)
T5 paper: 2019.10 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer Task: Everything Prompt: 前缀式人工prompt Model: Encoder-Decoder Take Away: 加入前缀Prompt,所有NLP任务都可以转化为文本生成任务 T5论文的初衷如…...

119 BFS和DFS解二叉树的所有路径
问题描述:给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。 DFS求解:定义一个全局的链表,用来装所有的结果,通过DFS遍历,一旦遍历到当前节点没有子节点…...

SpringBoot缓存相关注解的使用
CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置 Cacheable:主要方法的返回值将被加入缓存。在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问 CachePut:主要用于数据新增和修改操作 CacheEvi…...

SpiderFlow爬虫平台漏洞利用分析(CVE-2024-0195)
1. 漏洞介绍 SpiderFlow爬虫平台项目中spider-flow-web\src\main\java\org\spiderflow\controller\FunctionController.java文件的FunctionService.saveFunction函数调用了saveFunction函数,该调用了自定义函数validScript,该函数中用户能够控制 functi…...

计算机网络-甘晴void学习笔记
计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…...

vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果
文章目录 一、实现效果二、实现方法1、安装echarts插件2、获取省市json数据3、本例中data 数据4、吉林省地图的绘制5、柱状图样式6、设置柱状底部涟漪特效样式7、数据处理 三、示例代码已上传,去顶部可下载四、效果展示 一、实现效果 使用echarts实现省市地图绘制&…...

Android aar包集成与报错
Android Studio引用AAR的方式,分为gradle7.0之前与7.0之后 一、集成步骤 方法一: 1.将对应的xxx.aar包复制到项目的libs目录下(xxx代表需要引入的aar包名称) 2.然后在模块的build.gradle文件中配置implementation files(libs/lib…...

CentOS 7.9 安装图解
特特特别的说明 CentOS发行版已经不再适合应用于生产环境,客观条件不得不用的话,优选7.9版本,8.5版本次之,最次6.10版本(比如说Oracle 11GR2就建议在6版本上部署)! 引导和开始安装 选择倒计时结…...

Gitea Webhook报错 webhook.ALLOWED_HOST_LIST setting
Gitea Webhook报错 webhook.ALLOWED_HOST_LIST setting 登录到Gitea中,编辑app.ini vi /data/gitea/conf/app.ini [webhook] ALLOWED_HOST_LIST 你的IP地址示例 [webhook] ALLOWED_HOST_LIST 192.168.3.98...

SQL 最大连续合格次数 最大连胜记录次数 最大连败记录次数
有这样一个问题,工厂中要统计某个供应商送货检验的情况,依照其连续合格次数,决定是否免检,不使用游标或者循环,如何写这个sql。 此情景也可以用于统计连胜记录等 先要学习一下 窗函数LAG,指的是按分组和排…...

着色器语言GLSL学习
1 初步尝试 import { Scene, WebGLRenderer, OrthographicCamera, PlaneGeometry, ShaderMateria } from three.jsconst scene new Scene() const camera new OrthographicCamera(-1,1,1,-1,0.1, 10)const renderer new WebGLRenderer() renderer.setSize(window.innerWidt…...

C#: form 窗体的各种操作
说明:记录 C# form 窗体的各种操作 1. C# form 窗体居中显示 // 获取屏幕的宽度和高度 int screenWidth Screen.PrimaryScreen.Bounds.Width; int screenHeight Screen.PrimaryScreen.Bounds.Height;// 设置窗体的位置 this.StartPosition FormStartPosition.M…...

“尔滨”宠粉再升级!百亿像素VR冰雪盛宴
1月10日,由哈尔滨市委网信办、哈尔滨日报社主办,冰城客户端、哈尔滨新闻网承办的“激情迎亚冬,冰雪暖世界——2024年哈尔滨冰雪乐园”VR沉浸式体验产品正式上线。 如果你还没去过最近爆火出圈的“尔滨” ❄️这份哈尔滨冰雪景点VR❄️ 为你…...

redis原理(四)redis命令
目录 一、字符串命令: 二、列表命令: 三、集合命令: 四、散列命令: 五、有序集合命令: 六、redis发布与订阅命令: 七、事务命令 八、其他命令 1、排序:SORT 2、键的过期时间ÿ…...

FairGuard游戏安全2023年度报告
导 读:2023年,游戏行业摆脱了疫情带来诸多负面影响,国内游戏市场收入与用户规模双双实现突破,迎来了历史新高点。但游戏黑灰产规模也在迅速扩大,不少游戏饱受其侵扰,游戏厂商愈发重视游戏安全问题。 为帮助…...

进阶Docker4:网桥模式、主机模式与自定义网络
目录 网络相关 子网掩码 网关 规则 docke网络配置 bridge模式 host模式 创建自定义网络(自定义IP) 网络相关 IP 子网掩码 网关 DNS 端口号 子网掩码 互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。 IP 地…...