Hmac - Java加密与安全

Hmac算法

1. Hmac是Hash-based Messsage Authentication Code的缩写,它是一种基于密钥的消息认证算法

2. 也是一种更安全的额消息摘要算法


例如HmacMD5算法,它相当于我们使用一个随机安全的key,和原始数据混合以后,做MD5摘要

HmacMD5可以看作是带安全Salt的MD5,当我们直接使用MD5的时候,我们需要自己生成一个salt,然后通过salt和

原始数据data,对这两个数据进行MD5摘要,而我们使用HmacMD5的时候,我们直接获取一个HmacMD5的KeyGenerator,

然后通过这个KeyGenerator,获取一个随机的SecretKey,紧接着我们通过Mac.getInstance("HmacMD5")获得一个

Mac的实例,然后我们先初始化这个SecretKey,然后再计算输入数据的MD5

这样我们就可以存储用户密码的MD5改写为直接使用一个secret key直接存储密码的Hmac的MD5

我们使用的Secret Key有64个字节,因此用HmacMD5会更安全
package com.learn.securl;

import java.security.NoSuchAlgorithmException;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;

public class HmacDemo {

	/**
	 * 我们传入一个hmac算法hmacAlgorithm
	 * skey以及检索数据的输入
	 * @param hmacAlgorithm
	 * @param skey
	 * @param input
	 * @return
	 * @throws Exception
	 */
	public static byte[] hmac(String hmacAlgorithm, SecretKey skey, byte[] input) throws Exception {
		/**
		 * 然后我们通过一个Mac.getInstance获取一个Mac实例
		 */
		Mac mac = Mac.getInstance(hmacAlgorithm);
		/**
		 * 我们通过init传入一个SecretKey来初始化
		 */
		mac.init(skey);
		/**
		 * 紧接着我们用update方法传入原始数据
		 */
		mac.update(input);
		/**
		 * 通过doFinal方法得到Hmac算法得到的哈希
		 */
		return mac.doFinal();
	}
	
    public static String bytesToHexString(byte... src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }
	
	public static void main(String[] args) throws Exception {
		// String algorithm = "HmacSHA1";
		/**
		 * 我们只需要把SHA1改成SHA256就行了
		 * 这个时候生成出来的哈希就是SHA256
		 */
		String algorithm = "HmacSHA256";
		/**
		 * 原始数据:
		 */
		String data = "helloworld";
		/**
		 * 随机生成一个Key:
		 * 
		 * 首先我们通过KeyGenerator.getInstance
		 * 然后传入算法名称
		 * 得到一个KeyGenerator
		 */
		KeyGenerator keyGen = KeyGenerator.getInstance(algorithm);
		/**
		 * 我们通过generateKey获得一个SecretKey
		 */
		SecretKey skey = keyGen.generateKey();
		/**
		 * 打印Key:
		 * 
		 * 然后我们通过getEncoded把SecretKey转换为byte数组
		 */
		byte[] key = skey.getEncoded();
		/**
		 * 然后打印出来
		 */
		System.out.println(bytesToHexString(key));
		/**
		 * 用这个Key来计算:
		 * 
		 * 最后我们可以通过key来计算hmac值
		 */
		byte[] result = hmac(algorithm, skey, data.getBytes());
		/**
		 * b286b2267357dd475a281bf68d72e88d68586767
		 * 哈希是20个字节的数组
		 */
		System.out.println(bytesToHexString(result));
	}	
}
最后我们总结一下:

1. Hmac就是把Key混入摘要的一种算法

2. 他可以配合MD5,SHA-1等摘要算法

3. 我们需要注意的是,Hmac并不是重新发明的一种摘要算法,而需要配合MD5,SHA-1等摘要算法

4. 最后计算的摘要长度和原摘要算法的长度是相同的

 

### 创建和配置华为云上的 Jupyter Notebook 环境 #### 购买并启动华为云 Flexus X 实例 为了获得最佳的学习体验,建议选择华为云提供的高性能实例——Flexus X。该实例进行了多项底层优化,并采用创新的大模型支持与智能全域调度技术,使得其性能表现卓越[X-Turbo加速技术支持下的性能提升显著][^1]。 #### 安装 AnacondaJupyter Notebook 一旦拥有运行中的华为云实例,下一步就是安装Anaconda以及Jupyter Notebook。这通常涉及通过SSH访问远程服务器,在命令行环境中执行一系列指令完成软件包的下载与安装过程[^2]: ```bash # 更新系统包列表 sudo apt-get update && sudo apt-get upgrade -y # 下载最新版本的Anaconda脚本 wget https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-x86_64.sh # 执行安装程序(按提示操作) bash Anaconda3-2023.07-1-Linux-x86_64.sh # 初始化Conda环境变量 source ~/.bashrc # 使用Conda安装Jupyter Notebook conda install jupyter ``` #### 配置 Jupyter Notebook 外部访问权限 为了让外部设备能够安全地连接到部署于云端的Jupyter服务端口,需生成必要的SSL证书及密钥文件,并修改默认的安全策略允许来自特定IP地址范围内的请求进入: ```bash # 生成自签名SSL证书用于HTTPS加密通信 openssl req -days 365 -newkey rsa:2048 \ -keyout mycert.key -out mycert.pem # 设置Jupyter配置参数以启用密码保护和其他选项 jupyter notebook --generate-config # 编辑~/.jupyter/jupyter_notebook_config.py 文件添加如下内容: c.NotebookApp.certfile = u'/path/to/mycert.pem' c.NotebookApp.keyfile = u'/path/to/mycert.key' # 同时设置登录密码 from notebook.auth import passwd; print(passwd()) ``` #### 访问工作区管理界面 成功完成后,可以通过浏览器输入指定URL加上相应端口号来打开Jupyter的工作空间页面。在这里,用户不仅可以看到类似于本地计算机的操作视图,还可以方便地管理和分享项目资源;同时也能轻松切换不同的Python解释器作为计算引擎来编代码片段或完整的应用程序[^3]。 #### 自动保存功能确认 最后一步是要确保启用了自动保存特性,这对于长时间在线编程尤其重要。虽然大多数情况下这项功能已经预设为激活状态,但仍可通过查看`~/.jupyter/jupyter_notebook_config.json`文件中的相关条目来进行验证[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值