前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于java和PowerShell使用SHA-256和BASE64加密字符串的进制位计算差异

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

作者头像
火之高兴
发布2024-07-25 15:27:43
390
发布2024-07-25 15:27:43
举报
文章被收录于专栏:大数据应用技术

1 需求描述

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

2 实验过程

2.1 Power shell加密操作

在这里插入图片描述
在这里插入图片描述

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

代码语言:javascript
复制
 Get-FileHash "C:\Users\Lenovo\OneDrive\桌面\sha256.txt"

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

代码语言:javascript
复制
Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          936A185CAAA266BB9CBE981E9E05CB78CD732B0B3280EB944412BB6F8F8F07AF       C:\Users\Lenovo\OneDrive\桌面...

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

代码语言:javascript
复制
[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes('936A185CAAA266BB9CBE981E9E05CB78CD732B0B3280EB944412BB6F8F8F07AF'))

Step5 得出BASE64值:

代码语言:javascript
复制
OTM2QTE4NUNBQUEyNjZCQjlDQkU5ODFFOUUwNUNCNzhDRDczMkIwQjMyODBFQjk0NDQxMkJCNkY4RjhGMDdBRg==

2.2 Java加密操作

代码语言:javascript
复制
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 代码分析

首先,使用 MessageDigest.getInstance("SHA-256") 获取 SHA-256 的消息摘要对象。

将字符串 “helloworld” 编码为字节数组,并使用 SHA-256 消息摘要对象计算其哈希值。这一部分在以下行完成:

代码语言:javascript
复制
byte[] hash = sha256.digest(content.getBytes(StandardCharsets.UTF_8));

将 SHA-256 哈希值转换为十六进制字符串。该步骤对应‘【结果2】 SHA-256 十六进制’的输出结果,这一部分在以下代码中完成:

代码语言:javascript
复制
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();

将二进制形式的 SHA-256 哈希值转换为 BASE64 编码的字符串,该步骤对应‘【结果1】’的输出结果。这一部分在以下代码中完成:

代码语言:javascript
复制
BASE64Encoder base64 = new BASE64Encoder();
String result =  base64.encode(hash);

将十六进制形式的 SHA-256 哈希值转换为 BASE64 编码的字符串,该步骤对应‘【结果2:】 BASE64 十六进制’的输出结果。这一部分在以下代码中完成:

代码语言:javascript
复制
BASE64Encoder base64in16 = new BASE64Encoder();
String result2 =  base64in16.encode(str16.getBytes());

打印结果:

代码语言:javascript
复制
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 输出结果
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
【结果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值。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 需求描述
  • 2 实验过程
    • 2.1 Power shell加密操作
      • 2.2 Java加密操作
        • 2.2.1 代码分析
        • 2.2.2 输出结果
    • 3 实验总结
    相关产品与服务
    腾讯云代码分析
    腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档