Exploring
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
  • Java

    • 基础

      • 面向对象的思想OOP
      • 浅谈Java反射原理
      • endorsed覆盖JDK中的类
      • Java8新特性之函数式接口
      • Java集合之HashMap与ConcurrentHashMap
      • Java语法级常见面试题
      • Java中的四种引用类型详解
      • Java中的摘要算法MessageDigest
        • MessageDigest
          • 例子
        • 输出
        • HMac
          • 示例
      • Java中注解Annotation概念及原理
      • Java中final关键词详解
      • jdk源码分析-TreeMap红黑树插入删除过程
    • 并发与多线程

    • 日志系统

    • 单元测试

    • JVM

    • Spring

    • SpringBoot

    • 一些工具

  • 语言
  • Java
  • 基础
unclezs
2020-12-19
0
目录

Java中的摘要算法MessageDigest

# MessageDigest

Java 的摘要算法在 java.security 包下 MessageDigest,通过 SPI 加载更多的摘要算法,这个包还提供了一些 Java 的权限检查,这里提一下摘要算法,用可以配合 Base64 或者 Hex 转化组合进行加密。 可以有 MD2、MD5、SHA-224、SHA-256、SHA-384、SHA-512 等等

# 例子

/**
 * Java的摘要算法
 *
 * @author unclezs
 * @since 2020/12/19 14:48
 */
@Slf4j
public class MessageDigestSample {
  /**
   * 常用的摘要算法
   */
  public static final String DIGEST_MD2 = "MD2";
  public static final String DIGEST_MD5 = "MD5";
  public static final String DIGEST_SHA = "SHA";
  public static final String DIGEST_SHA_224 = "SHA-224";
  public static final String DIGEST_SHA_256 = "SHA-256";
  public static final String DIGEST_SHA_384 = "SHA-384";
  public static final String DIGEST_SHA_512 = "SHA-512";

  public static void main(String[] args) {
    String[] algorithms =
        {DIGEST_MD2, DIGEST_MD5, DIGEST_SHA, DIGEST_SHA_224, DIGEST_SHA_256, DIGEST_SHA_384, DIGEST_SHA_512};
    for (String algorithm : algorithms) {
      try {
        String original = "original";
        String salt = "salt";
        MessageDigest digest = MessageDigest.getInstance(algorithm);
        digest.reset();
        digest.update(salt.getBytes(StandardCharsets.UTF_8));
        byte[] hashed = digest.digest(original.getBytes());
        log.info("{}生成的摘要:{}", algorithm, Arrays.toString(hashed));
      } catch (NoSuchAlgorithmException e) {
        log.error("摘要算法不存在:{}", algorithm, e);
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 输出

# HMac

HMAC(Hash-based Message Authentication Code,散列消息认证码)是一种使用密码散列函数,同时结合一个加密密钥,通过特别计算方式之后产生的消息认证码(MAC)。它可以用来保证数据的完整性,同时可以用来作某个消息的身份验证。 HMAC 算法 是一种基于密钥的报文完整性的验证方法。HMAC 算法利用哈希运算,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。其安全性是建立在 Hash 加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行 Hash 运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。HMAC 算法可以用来作加密、数字签名、报文验证等。

在 javax.crypto 包下提供了实现

# 示例

/**
 * HmacSha256算法加密
 * https://blog.csdn.net/sdnyqfyqf/article/details/105534376
 *
 * @author unclezs
 * @since 2020/12/19 16:33
 */
@Slf4j
public class HmacSample {
  public static void main(String[] args) {
    log.info("HmacSHA256 加密后:{}",byHmacSha256("salt", "unclezs"));
  }

  private static byte[] byHmacSha256(String salt, String original) {
    String hmacSha256 = "HmacSHA256";
    try {
      Mac mac = Mac.getInstance(hmacSha256);
      SecretKey key = new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), hmacSha256);
      mac.init(key);
      return mac.doFinal(original.getBytes(StandardCharsets.UTF_8));
    } catch (NoSuchAlgorithmException e) {
      log.error("加密算法不存在:{}", hmacSha256, e);
    } catch (InvalidKeyException e) {
      log.error("非法私有key:{}", hmacSha256, e);
    }
    return new byte[0];
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2020-12-19 16:45:20 [main] INFO  com.unclezs.samples.java.encryption.HmacSample #main:23 - HmacSHA256 加密后:[3, 40, -93, -87, 70, 63, 79, 86, 31, 59, -1, -67, 115, -26, 76, -46, 31, 4, 35, -119, -112, -82, 43, -27, 97, -12, 76, 63, 115, -113, 41, 109]
1
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11
Java中的四种引用类型详解
Java中注解Annotation概念及原理

← Java中的四种引用类型详解 Java中注解Annotation概念及原理→

Theme by Vdoing | Copyright © 2018-2024 unclezs
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式