基于java和PowerShell使用SHA-256和BASE64加密字符串的进制位计算差异

本文详细描述了如何在Powershell和Java中使用SHA-256和BASE64算法对字符串helloworld进行加密,并提供了两种方法的代码示例和输出结果的对比。
摘要由CSDN通过智能技术生成

1 需求描述

将字符串helloworld使用SHA-256和BASE64算法进行加密。

2 实验过程

2.1 Power shell加密操作

在这里插入图片描述

Step1 首先将helloworld写在桌面新建的txt文件中,并且复制路径。
Step2 打开PowerShell,输入以下命令,开始计算SHA-256:

 Get-FileHash "C:\Users\Lenovo\OneDrive\桌面\sha256.txt"

Step3 返回SHA-256的计算结果,复制该结果。

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          936A185CAAA266BB9CBE981E9E05CB78CD732B0B3280EB944412BB6F8F8F07AF       C:\Users\Lenovo\OneDrive\桌面...

Step4 复制的SHA-256计算结果粘贴至该命令括号内,开始计算BASE64:

[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes('936A185CAAA266BB9CBE981E9E05CB78CD732B0B3280EB944412BB6F8F8F07AF'))

Step5 得出BASE64值:

OTM2QTE4NUNBQUEyNjZCQjlDQkU5ODFFOUUwNUNCNzhDRDczMkIwQjMyODBFQjk0NDQxMkJCNkY4RjhGMDdBRg==

2.2 Java加密操作

package org.example;

import sun.misc.BASE64Encoder;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Main {
    public static void main(String[] args) {

        MessageDigest sha256 = null;
        try {
            String content = "helloworld";
            
            // 先对helloworld进行 SHA256 加密
            sha256 = MessageDigest.getInstance("SHA-256");
            byte[] hash = sha256.digest(content.getBytes(StandardCharsets.UTF_8));
            // 再对加密后的二进制数组进行 BASE64 加密
            BASE64Encoder base64 = new BASE64Encoder();
            String result =  base64.encode(hash);

            // 将二进制SHA-256转换为十六进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            String str16 = hexString.toString();
            
            // 十六进制hash进行base64加密
            BASE64Encoder base64in16 = new BASE64Encoder();
            String result2 =  base64in16.encode(str16.getBytes());
            
            // 打印结果
            System.out.println("【结果1】 base64二进制字节流:");
            System.out.println(result);
            System.out.println("【结果2】 SHA-256 十六进制: ");
            System.out.println(str16);
            System.out.println("【结果2:】 BASE64 十六进制:");
            System.out.println(result2);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        
    }
}

2.2.1 代码分析

  1. 首先,使用 MessageDigest.getInstance("SHA-256") 获取 SHA-256 的消息摘要对象。
  2. 将字符串 “helloworld” 编码为字节数组,并使用 SHA-256 消息摘要对象计算其哈希值。这一部分在以下行完成:
    byte[] hash = sha256.digest(content.getBytes(StandardCharsets.UTF_8));
    
  3. 将 SHA-256 哈希值转换为十六进制字符串。该步骤对应‘【结果2】 SHA-256 十六进制’的输出结果,这一部分在以下代码中完成:
    StringBuilder hexString = new StringBuilder();
    for (byte b : hash) {
        String hex = Integer.toHexString(0xff & b);
        if (hex.length() == 1) {
            hexString.append('0');
        }
        hexString.append(hex);
    }
    String str16 = hexString.toString();
    
  4. 将二进制形式的 SHA-256 哈希值转换为 BASE64 编码的字符串,该步骤对应‘【结果1】’的输出结果。这一部分在以下代码中完成:
    BASE64Encoder base64 = new BASE64Encoder();
    String result =  base64.encode(hash);
    
  5. 将十六进制形式的 SHA-256 哈希值转换为 BASE64 编码的字符串,该步骤对应‘【结果2:】 BASE64 十六进制’的输出结果。这一部分在以下代码中完成:
    BASE64Encoder base64in16 = new BASE64Encoder();
    String result2 =  base64in16.encode(str16.getBytes());
    
  6. 打印结果:
    System.out.println("【结果1】 base64二进制字节流:");
    System.out.println(result);
    System.out.println("【结果2】 SHA-256 十六进制: ");
    System.out.println(str16);
    System.out.println("【结果2:】 BASE64 十六进制:");
    System.out.println(result2);
    

2.2.2 输出结果

在这里插入图片描述

【结果1】 base64二进制字节流:
k2oYXKqiZrucvpgengXLeM1zKwsygOuURBK7b4+PB68=
【结果2】 SHA-256 十六进制: 
936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af
【结果2:】 BASE64 十六进制:
OTM2YTE4NWNhYWEyNjZiYjljYmU5ODFlOWUwNWNiNzhjZDczMmIwYjMyODBlYjk0NDQxMmJiNmY4
ZjhmMDdhZg==

3 实验总结

Java 示例中的【结果1】使用的是标准的 Java 加密库中的 MessageDigest 类来计算 SHA-256 哈希值,然后使用 BASE64Encoder 类将二进制哈希值转换为 BASE64 编码的字符串。
【结果2】的BASE64计算输出则与使用PowerShell计算相同 ,因为在PowerShell中使用的是 Get-FileHash 命令来计算文件的 SHA-256 哈希值,该输出对应java【结果2】中十六进制SHA-256的计算。在PowerShell中Step4计算的BASE64编码是十六进制的SHA-256值。

在实际操作中要注意的就是加密的字符串是否为相同的进制位。

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据程序终结者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值