当前位置: 代码网 > it编程>编程语言>Java > Java常用加密算法详解与示例代码

Java常用加密算法详解与示例代码

2025年07月09日 Java 我要评论
1. 前言在信息安全领域,加密算法是保护数据机密性、完整性和身份认证的核心手段。java 标准库及第三方框架(如 bouncycastle)提供了丰富的加解密实现,这里小编将结合 java 代码,详细

1. 前言

在信息安全领域,加密算法是保护数据机密性、完整性和身份认证的核心手段。java 标准库及第三方框架(如 bouncycastle)提供了丰富的加解密实现,这里小编将结合 java 代码,详细介绍常用的几类加密算法,并给出可直接运行的测试示例,帮助小伙伴们快速上手。

2. 加密算法基础分类

2.1 哈希算法

  • 特点:单向不可逆,固定长度输出
  • 用途:数据完整性验证、密码存储
  • 代表算法:md5、sha-1、sha-256、sha-512

2.2 对称加密算法

  • 特点:加密解密使用相同密钥
  • 优势:速度快,适合大数据量加密
  • 代表算法aes、des、3des、rc4

2.3 非对称加密算法

  • 特点:公钥加密,私钥解密
  • 优势:安全性高,解决密钥分发问题
  • 代表算法rsa、ecc、dsa

2.4 消息认证码(mac)

  • 特点:带密钥的哈希函数
  • 用途:验证消息完整性和来源
  • 代表算法hmac

3. 哈希算法

3.1 原理与特点

hash(摘要):将任意长度的数据“压缩”成定长的输出,常用于数据完整性校验。
不可逆:无法从摘要反向推算原文;对抗碰撞攻击(不同输入产生相同输出)是设计目标之一。

3.2 java 示例

import java.security.messagedigest;
import java.security.nosuchalgorithmexception;

public class hashutils {

    public static string hash(string input, string algorithm) {
        try {
            messagedigest md = messagedigest.getinstance(algorithm);
            byte[] digest = md.digest(input.getbytes());
            // 转为十六进制
            stringbuilder sb = new stringbuilder();
            for (byte b : digest) {
                sb.append(string.format("%02x", b & 0xff));
            }
            return sb.tostring();
        } catch (nosuchalgorithmexception e) {
            throw new runtimeexception("unknown algorithm: " + algorithm, e);
        }
    }

    // 测试主函数
    public static void main(string[] args) {
        string text = "helloworld";
        system.out.println("md5:    " + hash(text, "md5"));
        system.out.println("sha-1:  " + hash(text, "sha-1"));
        system.out.println("sha-256:" + hash(text, "sha-256"));
    }
}

运行后,你将看到三种摘要值,验证不同算法的输出长度和差异。

4. 对称加密算法

对称加密使用同一个密钥进行加解密,速度快,适合大数据量场景。

由于 des 已较为过时,不推荐在新项目中使用,这里就不做des介绍了,下面主要讲解一下aes

2.1 aes(advanced encryption standard)

密钥长度:128/192/256 位
模式:ecb(电子密码本)、cbc(密码分组链接)等;cbc 更安全但需 iv

2.2 aes 示例

import javax.crypto.cipher;
import javax.crypto.keygenerator;
import javax.crypto.secretkey;
import javax.crypto.spec.ivparameterspec;
import java.util.base64;

public class aesutils {

    // 生成 aes 密钥
    public static secretkey genkey(int keysize) throws exception {
        keygenerator kg = keygenerator.getinstance("aes");
        kg.init(keysize);
        return kg.generatekey();
    }

    // 加密
    public static string encrypt(string plaintext, secretkey key, ivparameterspec iv) throws exception {
        cipher cipher = cipher.getinstance("aes/cbc/pkcs5padding");
        cipher.init(cipher.encrypt_mode, key, iv);
        byte[] encrypted = cipher.dofinal(plaintext.getbytes());
        return base64.getencoder().encodetostring(encrypted);
    }

    // 解密
    public static string decrypt(string ciphertext, secretkey key, ivparameterspec iv) throws exception {
        cipher cipher = cipher.getinstance("aes/cbc/pkcs5padding");
        cipher.init(cipher.decrypt_mode, key, iv);
        byte[] decoded = base64.getdecoder().decode(ciphertext);
        byte[] decrypted = cipher.dofinal(decoded);
        return new string(decrypted);
    }

    public static void main(string[] args) throws exception {
        string text = "secretmessage";
        secretkey key = genkey(128);
        // 随机 iv,也可使用固定 iv(不推荐)
        byte[] ivbytes = new byte[16];
        system.arraycopy("randominitvector".getbytes(), 0, ivbytes, 0, 16);
        ivparameterspec iv = new ivparameterspec(ivbytes);

        string ciphertext = encrypt(text, key, iv);
        string plaintext = decrypt(ciphertext, key, iv);

        system.out.println("原文: " + text);
        system.out.println("加密: " + ciphertext);
        system.out.println("解密: " + plaintext);
    }
}

5. 非对称加密算法

5.1 rsa算法

算法特点:

基于大数分解难题
密钥长度:1024-4096位
用途:数字签名、密钥交换

import javax.crypto.cipher;
import java.nio.charset.standardcharsets;
import java.security.*;
import java.security.spec.pkcs8encodedkeyspec;
import java.security.spec.x509encodedkeyspec;
import java.util.base64;

public class rsaexample {
    public static void main(string[] args) throws exception {
        string plaintext = "java非对称加密算法";
        
        // 生成密钥对
        keypair keypair = generatersakeypair();
        publickey publickey = keypair.getpublic();
        privatekey privatekey = keypair.getprivate();
        
        // 公钥加密
        byte[] ciphertext = encryptrsa(plaintext, publickey);
        system.out.println("rsa加密结果: " + base64.getencoder().encodetostring(ciphertext));
        
        // 私钥解密
        string decryptedtext = decryptrsa(ciphertext, privatekey);
        system.out.println("rsa解密结果: " + decryptedtext);
        
        // 数字签名示例
        byte[] signature = signdata(plaintext, privatekey);
        boolean isvalid = verifysignature(plaintext, signature, publickey);
        system.out.println("签名验证结果: " + isvalid);
    }

    public static keypair generatersakeypair() throws exception {
        keypairgenerator keypairgenerator = keypairgenerator.getinstance("rsa");
        keypairgenerator.initialize(2048); // 密钥长度
        return keypairgenerator.generatekeypair();
    }

    public static byte[] encryptrsa(string plaintext, publickey publickey) throws exception {
        cipher cipher = cipher.getinstance("rsa/ecb/oaepwithsha-256andmgf1padding");
        cipher.init(cipher.encrypt_mode, publickey);
        return cipher.dofinal(plaintext.getbytes(standardcharsets.utf_8));
    }

    public static string decryptrsa(byte[] ciphertext, privatekey privatekey) throws exception {
        cipher cipher = cipher.getinstance("rsa/ecb/oaepwithsha-256andmgf1padding");
        cipher.init(cipher.decrypt_mode, privatekey);
        byte[] decryptedbytes = cipher.dofinal(ciphertext);
        return new string(decryptedbytes, standardcharsets.utf_8);
    }

    public static byte[] signdata(string data, privatekey privatekey) throws exception {
        signature signature = signature.getinstance("sha256withrsa");
        signature.initsign(privatekey);
        signature.update(data.getbytes(standardcharsets.utf_8));
        return signature.sign();
    }

    public static boolean verifysignature(string data, byte[] signaturebytes, publickey publickey) throws exception {
        signature signature = signature.getinstance("sha256withrsa");
        signature.initverify(publickey);
        signature.update(data.getbytes(standardcharsets.utf_8));
        return signature.verify(signaturebytes);
    }
}

5.2 ecc(椭圆曲线加密)

算法特点:

同等安全强度下密钥更短
计算效率高
适合移动设备

import java.nio.charset.standardcharsets;
import java.security.*;
import java.security.spec.pkcs8encodedkeyspec;
import java.security.spec.x509encodedkeyspec;
import java.util.base64;

public class eccexample {
    public static void main(string[] args) throws exception {
        string plaintext = "java椭圆曲线加密";
        
        // 生成密钥对
        keypair keypair = generateecckeypair();
        publickey publickey = keypair.getpublic();
        privatekey privatekey = keypair.getprivate();
        
        // 密钥序列化/反序列化演示
        string pubkeystr = base64.getencoder().encodetostring(publickey.getencoded());
        string prikeystr = base64.getencoder().encodetostring(privatekey.getencoded());
        
        // 从字符串恢复密钥
        publickey restoredpubkey = restoreeccpublickey(pubkeystr);
        privatekey restoredprikey = restoreeccprivatekey(prikeystr);
        
        // 数字签名
        byte[] signature = signdataecc(plaintext, restoredprikey);
        boolean isvalid = verifysignatureecc(plaintext, signature, restoredpubkey);
        system.out.println("ecc签名验证结果: " + isvalid);
    }

    public static keypair generateecckeypair() throws exception {
        keypairgenerator keypairgenerator = keypairgenerator.getinstance("ec");
        keypairgenerator.initialize(256); // 密钥长度
        return keypairgenerator.generatekeypair();
    }

    public static publickey restoreeccpublickey(string keystr) throws exception {
        byte[] keybytes = base64.getdecoder().decode(keystr);
        x509encodedkeyspec keyspec = new x509encodedkeyspec(keybytes);
        keyfactory keyfactory = keyfactory.getinstance("ec");
        return keyfactory.generatepublic(keyspec);
    }

    public static privatekey restoreeccprivatekey(string keystr) throws exception {
        byte[] keybytes = base64.getdecoder().decode(keystr);
        pkcs8encodedkeyspec keyspec = new pkcs8encodedkeyspec(keybytes);
        keyfactory keyfactory = keyfactory.getinstance("ec");
        return keyfactory.generateprivate(keyspec);
    }

    public static byte[] signdataecc(string data, privatekey privatekey) throws exception {
        signature signature = signature.getinstance("sha256withecdsa");
        signature.initsign(privatekey);
        signature.update(data.getbytes(standardcharsets.utf_8));
        return signature.sign();
    }

    public static boolean verifysignatureecc(string data, byte[] signaturebytes, publickey publickey) throws exception {
        signature signature = signature.getinstance("sha256withecdsa");
        signature.initverify(publickey);
        signature.update(data.getbytes(standardcharsets.utf_8));
        return signature.verify(signaturebytes);
    }
}

6. 消息认证码(hmac)

hmac 用于验证数据完整性及认证,结合了 hash 与密钥。

算法特点:

输入:密钥 + 消息 → 通过 hash 计算,输出固定长度摘要。
常见算法:hmacmd5、hmacsha1、hmacsha256

import javax.crypto.mac;
import javax.crypto.spec.secretkeyspec;
import java.nio.charset.standardcharsets;
import java.security.invalidkeyexception;
import java.security.nosuchalgorithmexception;
import java.util.base64;

public class hmacexample {
    public static void main(string[] args) throws exception {
        string message = "重要业务数据";
        string secretkey = "mysecretkey123";
        
        // 计算hmac
        string hmac = calculatehmac(message, secretkey);
        system.out.println("hmac-sha256: " + hmac);
        
        // 验证消息完整性
        string receivedmessage = "重要业务数据";
        string receivedhmac = calculatehmac(receivedmessage, secretkey);
        system.out.println("hmac验证结果: " + hmac.equals(receivedhmac));
    }

    public static string calculatehmac(string data, string key) 
            throws nosuchalgorithmexception, invalidkeyexception {
        mac sha256hmac = mac.getinstance("hmacsha256");
        secretkeyspec secretkey = new secretkeyspec(
            key.getbytes(standardcharsets.utf_8), 
            "hmacsha256"
        );
        sha256hmac.init(secretkey);
        byte[] hmacbytes = sha256hmac.dofinal(data.getbytes(standardcharsets.utf_8));
        return base64.getencoder().encodetostring(hmacbytes);
    }
}

7. 总结

本文博主介绍了四大类经典加密算法在 java 中的实现方式:

  • 哈希算法:md5、sha-1、sha-256,用于数据完整性校验;
  • 对称加密:aes、des,适合大数据量加密;
  • 非对称加密:rsa,实现密钥交换和数字签名;
  • 消息认证码:hmac,用于完整性与认证。

在生产环境中,建议优先选用 aes(至少 128 位)、sha-256rsa 2048 位以上,并严格管理密钥和 iv,以确保安全性。希望本文能帮助小伙伴快速掌握 java 加密实战!

以上就是java常用加密算法详解与示例代码的详细内容,更多关于java常用加密算法的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com