漫谈Java加密技术(一)

解锁Cherry Studio高阶玩法:用MCP实现自动化测试与数据爬取 本文深入探讨了如何利用MCP协议与Cherry Studio结合,实现自动化测试与数据爬取的高阶应用。通过Playwright等工具的MCP集成方案,详细解析了自动化测试流水线构建和智能爬虫系统开发的关键技术,显著提升工程效率和系统适应性。 阅读详情

http://java.chinaitlab.com/Special/javajm/Index.html

加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。

    言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书。

    如基本的单向加密算法:

    ●  BASE64 严格地说,属于编码格式,而非加密算法
    ●  MD5(Message Digest algorithm 5,信息摘要算法)
    ●  SHA(Secure Hash Algorithm,安全散列算法)
    ●  HMAC(Hash Message Authentication Code,散列消息鉴别码)

    复杂的对称加密(DES、PBE)、非对称加密算法:

    ●  DES(Data Encryption Standard,数据加密算法)
    ●  PBE(Password-based encryption,基于密码验证)
    ●  RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
    ●  DH(Diffie-Hellman算法,密钥一致协议)
    ●  DSA(Digital Signature Algorithm,数字签名)
    ●  ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)

    本篇内容简要介绍BASE64、MD5、SHA、HMAC几种方法。

    MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。

    BASE64

    按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)

    常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。

    通过java代码实现如下:

/**  
 * BASE64解密  
http://www.bt285.cn http://www.5a520.cn
 *   
 * 
@param key  
 * 
@return  
 * 
@throws Exception  
 
*/
  
public static byte[] decryptBASE64(String key) throws Exception {   
    
return (new BASE64Decoder()).decodeBuffer(key);   
}
   
  
/**  
 * BASE64加密  
 *   
 * 
@param key  
 * 
@return  
 * 
@throws Exception  
 
*/
  
public static String encryptBASE64(byte[] key) throws Exception {   
    
return (new BASE64Encoder()).encodeBuffer(key);   
}

    主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。

    MD5

    MD5 —— message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。

    通过java代码实现如下:

/**  
 * MD5加密 
http://www.bt285.cn http://www.5a520.cn  
 *   
 * 
@param data  
 * 
@return  
 * 
@throws Exception  
 
*/
  
public static byte[] encryptMD5(byte[] data) throws Exception {   
  
    MessageDigest md5 
= MessageDigest.getInstance(KEY_MD5);   
    md5.update(data);   
  
    
return md5.digest();   
  
}

    通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。

    SHA

    SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全。

    通过java代码实现如下:

 /**  
     * SHA加密 
http://www.5a520.cn http://www.bt285.cn 
     *   
     * 
@param data  
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static byte[] encryptSHA(byte[] data) throws Exception {   
  
        MessageDigest sha 
= MessageDigest.getInstance(KEY_SHA);   
        sha.update(data);   
  
        
return sha.digest();   
  
    }
   
}

HMAC

    HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

    通过java代码实现如下:

/**  
 * 初始化HMAC密钥  
http://www.guihua.org  http://www.feng123.com
 *   
 * 
@return  
 * 
@throws Exception  
 
*/
  
public static String initMacKey() throws Exception {   
    KeyGenerator keyGenerator 
= KeyGenerator.getInstance(KEY_MAC);   
  
    SecretKey secretKey 
= keyGenerator.generateKey();   
    
return encryptBASE64(secretKey.getEncoded());   
}
   
  
/**  
 * HMAC加密  
 *   
 * 
@param data  
 * 
@param key  
 * 
@return  
 * 
@throws Exception  
 
*/
  
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {   
  
    SecretKey secretKey 
= new SecretKeySpec(decryptBASE64(key), KEY_MAC);   
    Mac mac 
= Mac.getInstance(secretKey.getAlgorithm());   
    mac.init(secretKey);   
  
    
return mac.doFinal(data);   
  
}
 

    给出一个完整类,如下:

import java.security.MessageDigest;   
  
import javax.crypto.KeyGenerator;   
import javax.crypto.Mac;   
import javax.crypto.SecretKey;   
  
import sun.misc.BASE64Decoder;   
import sun.misc.BASE64Encoder;   
  
/**  
 * 基础加密组件  
http://www.bt285.cn http://www.feng123.com
 *   
 * 
@author 梁栋  
 * 
@version 1.0  
 * 
@since 1.0  
 
*/
  
public abstract class Coder {   
    
public static final String KEY_SHA = "SHA";   
    
public static final String KEY_MD5 = "MD5";   
  
    
/**  
     * MAC算法可选以下多种算法  
     *   
     * <pre>  
     * HmacMD5   
     * HmacSHA1   
     * HmacSHA256   
     * HmacSHA384   
     * HmacSHA512  
     * </pre>  
     
*/
  
    
public static final String KEY_MAC = "HmacMD5";   
  
    
/**  
     * BASE64解密  
     *   
     * 
@param key  
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static byte[] decryptBASE64(String key) throws Exception {   
        
return (new BASE64Decoder()).decodeBuffer(key);   
    }
   
  
    
/**  
     * BASE64加密  
     *   
     * 
@param key  
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static String encryptBASE64(byte[] key) throws Exception {   
        
return (new BASE64Encoder()).encodeBuffer(key);   
    }
   
  
    
/**  
     * MD5加密  
     *   
     * 
@param data  
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static byte[] encryptMD5(byte[] data) throws Exception {   
  
        MessageDigest md5 
= MessageDigest.getInstance(KEY_MD5);   
        md5.update(data);   
  
        
return md5.digest();   
  
    }
   
  
    
/**  
     * SHA加密  
     *   
     * 
@param data  
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static byte[] encryptSHA(byte[] data) throws Exception {   
  
        MessageDigest sha 
= MessageDigest.getInstance(KEY_SHA);   
        sha.update(data);   
  
        
return sha.digest();   
  
    }
   
  
    
/**  
     * 初始化HMAC密钥  
     *   
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static String initMacKey() throws Exception {   
        KeyGenerator keyGenerator 
= KeyGenerator.getInstance(KEY_MAC);   
  
        SecretKey secretKey 
= keyGenerator.generateKey();   
        
return encryptBASE64(secretKey.getEncoded());   
    }
   
  
    
/**  
     * HMAC加密  
     *   
     * 
@param data  
     * 
@param key  
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {   
  
        SecretKey secretKey 
= new SecretKeySpec(decryptBASE64(key), KEY_MAC);   
        Mac mac 
= Mac.getInstance(secretKey.getAlgorithm());   
        mac.init(secretKey);   
  
        
return mac.doFinal(data);   
  
    }
   
}

    再给出一个测试类:

import static org.junit.Assert.*;

import org.junit.Test;

/**
 *
 * @author 梁栋  http://www.feng123.com
 * @version 1.0
 * @since 1.0
 */
public class CoderTest {

    @Test
    public void test() throws Exception {
        String inputStr = "简单加密";
        System.err.println("原文:\n" + inputStr);

        byte[] inputData = inputStr.getBytes();
        String code = Coder.encryptBASE64(inputData);

        System.err.println("BASE64加密后:\n" + code);

        byte[] output = Coder.decryptBASE64(code);

        String outputStr = new String(output);

        System.err.println("BASE64解密后:\n" + outputStr);

        // 验证BASE64加密解密一致性
        assertEquals(inputStr, outputStr);

        // 验证MD5对于同一内容加密是否一致
        assertArrayEquals(Coder.encryptMD5(inputData), Coder
                .encryptMD5(inputData));

        // 验证SHA对于同一内容加密是否一致
        assertArrayEquals(Coder.encryptSHA(inputData), Coder
                .encryptSHA(inputData));

        String key = Coder.initMacKey();
        System.err.println("Mac密钥:\n" + key);

        // 验证HMAC对于同一内容,同一密钥加密是否一致
        assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(
                inputData, key));

        BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
        System.err.println("MD5:\n" + md5.toString(16));

        BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
        System.err.println("SHA:\n" + sha.toString(32));

        BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
        System.err.println("HMAC:\n" + mac.toString(16));
    }


树莓派5新手必看:保姆级ibus中文输入法安装与配置全流程(含.bashrc设置避坑) 本文详细介绍了在树莓派5上安装和配置ibus中文输入法的完整流程,包括系统环境准备、ibus框架安装、图形界面配置及常见问题解决方案。通过清晰的步骤说明和避坑指南,帮助新手快速实现中文输入功能,提升开发效率。 阅读详情

相关推荐

LangChain实战:用FAISS搭建本地文档问答系统(含Word文件处理避坑指南)

本文详细介绍了如何利用LangChain框架和FAISS向量数据库构建本地化智能文档问答系统,特别针对Word文档处理中的技术难点提供实用解决方案。通过模块化设计、本地化支持和多格式兼容,实现高效文档处理与精准问答,满足企业对数据隐私和安全的需求。

o4p5q6r7s的博客 410

java mjd_RSA加密Java/Kotlin

我一直试图用一个预先准备好的公钥在Kotlin/Java中加密一个简单的字符串,但是没有成功。val toEncrypt = "8uUrfe4OcJVUT5lkAP07WKrlGhIlAAwTRwAksBztVaa0hHdZp50EFjOmhrAmFsLQ"val publicKeyRaw ="-----BEGIN PUBLIC KEY-----\n" +"MIGfMA0GCSqGSIb3DQEB...

weixin_42299944的博客 271

盘点那些好用的SAP FIORI App(二) -上传凭证Upload Journal Entry

SAP FICO运维问题及解决方案分享

lijinbao171022的博客 1544

漫谈Java加密技术一至五

加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。 (一) 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书。 如基本的单向加密算法: ● BASE64 严格地说,属于编码格式,而非加密算法 ● MD5(Message Digest algori

elimago的专栏 7376

告别商业软件?实测用gnina(CNN打分版)做分子对接:从安装到跑通第一个案例

本文详细介绍了基于卷积神经网络(CNN)的开源分子对接工具gnina的安装与实战应用。从环境配置、编译安装到运行第一个COVID-19主蛋白酶抑制剂对接案例,全面解析了这款替代商业软件的强大功能,特别适合预算有限的研究团队进行药物发现和虚拟筛选。

weixin_42522320的博客 256

Claude Code(7):从零创建你的第一个 Skill

在前面的文章,我们介绍了 Skills 的基本概念,这篇我们深入实战,从零开始创建你的第一个 Skill,并逐步解锁所有配置项,让 Claude Code 真正熟悉你的测试规范和习惯。

blues_C的博客 650

漫谈Java加密技术系列文章 一至五

加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。(一) 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书。如基本的单向加密算法:● BASE64 严格地说,属于编码格式,而非加密算法● MD5(Message Digest algorithm 5,信息摘要算法)● SHA(Secure Hash Algorithm...

xshq 190

92. SAP ABAP 系统里长文本 Long Text 的设计和读取函数 READ_TEXT 的详细讲解

SAP ABAP中的长文本(Long Text)是指在SAP系统中存储和管理较长文本信息的一种机制。长文本通常用于存储描述性信息、注释、说明等,这些文本信息可能超过了标准数据库表字段的长度限制。 长文本的作用主要有以下几点: 1. 更多的信息存储:长文本允许您存储和显示比标准表字段允许的更多信息。例如,产品描述、用户注释、维护计划等可能需要大量的文本来详细描述。 2. 更好的可读性:长文本提供了更好的文本格式化选项,可以改善可读性。用户可以使用段落、列表、字体样式等格式化文本,以便更容易地理解和阅读。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1999

继续-漫谈Java加密技术(一)

  HMAC    HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。    通过ja

zhangrenhong的专栏 403

《RT-Thread入门与实战》第1章:RT-Thread概述与核心优势

2006年由熊谱翔发起2017年成立上海睿赛德电子科技公司2021年成为国内首个通过ISO 26262 ASIL-D认证的RTOS。

2301_79143213的博客 986

2、欧洲期权的赫斯顿模型

本文详细介绍了赫斯顿随机波动率模型在欧洲期权定价中的应用。模型通过引入随机方差过程,克服了布莱克-斯科尔斯模型中波动率恒定的局限性,更贴近市场实际。文章阐述了模型的动态结构、风险中性转换、期权定价公式及其半封闭解的计算方法,并提供了基于VBA的数值实现方案。通过梯形法则与高斯积分等数值方法对比,分析了不同积分策略的精度与效率。同时验证了当波动率为零时,赫斯顿模型退化为布莱克-斯科尔斯模型的一致性。最后讨论了模型的优势、挑战及实际应用建议,强调了数值积分稳定性和参数估计的重要性。

tequila的博客 350

漫谈Java加密技术

除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE   PBE   PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密

mao1059568684的专栏 2520

Universal Robot——在Gazebo中模拟UR5机器人

今天的目标是在Gazebo安装我们的ur5机器人。Gazebo是一个流行的模拟工具,它不仅可以让你像在Rviz中一样可视化你的机器人,而且还内置了一个物理引擎。这样你就可以在更真实的环境中测试你的机器人应用程序。我们将查看我们需要的属性 添加对我们的机器人——我们的order的描述,以模拟它以及如何在Gazebo中生成我们的机器人。

如果想成为中心,那么就到中心去吧。 1970

漫谈Java加密技术 六至十

(六)接下来我们介绍DSA数字签名,非对称加密的另一种实现。 DSADSA-Digital Signature Algorithm是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignatureStandard)。简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公

elimago的专栏 5557

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

漫谈Java加密技术(四)

RSA     这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman.这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥。相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了。RSA同时有两把钥匙,公钥与私钥。同时支持数

anlovejing的专栏 1155

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

漫谈Java加密技术(三)

除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE     PBE     PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂

anlovejing的专栏 514

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【漫谈Java加密技术(四)】

RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman.这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥。相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了。RSA同时有两把钥匙,公钥与私钥。...

dfy86404的博客 124

【漫谈Java加密技术(二)】

DES DES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode.其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 DES算法把64位的明文输入...

140

漫谈Java加密技术(二)

接下来我们介绍对称加密算法,最常用的莫过于DES数据加密算法。     DES     DES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode.其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作

站在搜素引擎上的巨人 664

【漫谈Java加密技术(三)】

除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE PBE PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑...

weixin_34090643的博客 101
上一篇: Mysql 关键字 保留字
下一篇: Java中的DatagramPacket与DatagramSocket的初步
逆乾坤
博客等级 码龄16年 30粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值