java类加密_Java中常用加密类型

1、对称加密

c83810a3479f

image.png

密钥:加解密钥相同

缺点:无法确保密钥被安全传递

常用算法:DES、3DES(TripleDES)、AES等

2、非对称加密

c83810a3479f

image.png

c83810a3479f

image.png

密钥:公私钥加密对,公钥加密,私钥解密

公钥由私钥生成,私钥可以推导出公钥,但是从公钥无法推出私钥

优点:解决了密钥传输中的安全问题

常用算法:RSA、ECC(椭圆曲线加密算法)

使用场景: SSH安全验证等

缺点:解决了信息传送的问题,但是又引入了新问题,即无法验证发送方是正确的,就是说,可能被伪造成发送方

3、哈希(Hash)

将一段数据(任意长度)经过计算装换成一段定长的数据

不可逆性:几乎无法通过哈希的结果推导出原文

无碰撞性:两个不同原文哈希后的结果一定不同

常用算法:MD5,SHA256

使用场景:

数据库中的用户密码存储(MD5)

挖矿计算(SHA256)

4、数字签名

c83810a3479f

image.png

密钥:私钥签名,公钥验证签名

使用场景: 比特币交易验证等

Demo

RSACoderTest .java

package com.xxx.security;

import static org.junit.Assert.*;

import org.junit.Before;

import org.junit.Test;

import java.util.Map;

public class RSACoderTest {

private String publicKey;

private String privateKey;

@Before

public void setUp() throws Exception {

Map keyMap = RSACoder.initKey();

publicKey = RSACoder.getPublicKey(keyMap);

privateKey = RSACoder.getPrivateKey(keyMap);

System.err.println("公钥: \n\r" + publicKey);

System.err.println("私钥: \n\r" + privateKey);

}

/**

* 非对称加密测试

*/

@Test

public void testEncrypt() throws Exception {

System.err.println("公钥加密——私钥解密");

String inputStr = "abc";

byte[] data = inputStr.getBytes();

byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);

byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData, privateKey);

String outputStr = new String(decodedData);

System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);

assertEquals(inputStr, outputStr);

}

/**

* 数字签名

*/

@Test

public void testSign() throws Exception {

System.err.println("私钥签名——公钥验证签名");

String inputStr = "sign";

byte[] data = inputStr.getBytes();

// 产生签名

String sign = RSACoder.sign(data, privateKey);

System.err.println("签名:\r" + sign);

// 验证签名

boolean status = RSACoder.verify(data, publicKey, sign);

System.err.println("状态:\r" + status);

assertTrue(status);

}

}

RSACoder.java

package com.xxx.security;

import java.security.Key;

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.Signature;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import java.util.HashMap;

import java.util.Map;

import javax.crypto.Cipher;

/**

* RSA安全编码组件

*

*/

public abstract class RSACoder extends Coder {

public static final String KEY_ALGORITHM = "RSA";

public static final String SIGNATURE_ALGORITHM = "MD5withRSA";

private static final String PUBLIC_KEY = "RSAPublicKey";

private static final String PRIVATE_KEY = "RSAPrivateKey";

/**

* 用私钥对信息生成数字签名

*

* @param data

* 加密数据

* @param privateKey

* 私钥

*

* @return

* @throws Exception

*/

public static String sign(byte[] data, String privateKey) throws Exception {

// 解密由base64编码的私钥

byte[] keyBytes = decryptBASE64(privateKey);

// 构造PKCS8EncodedKeySpec对象

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);

// KEY_ALGORITHM 指定的加密算法

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

// 取私钥匙对象

PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);

// 用私钥对信息生成数字签名

Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);

signature.initSign(priKey);

signature.update(data);

return encryptBASE64(signature.sign());

}

/**

* 校验数字签名

*

* @param data

* 加密数据

* @param publicKey

* 公钥

* @param sign

* 数字签名

*

* @return 校验成功返回true 失败返回false

* @throws Exception

*

*/

public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {

// 解密由base64编码的公钥

byte[] keyBytes = decryptBASE64(publicKey);

// 构造X509EncodedKeySpec对象

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);

// KEY_ALGORITHM 指定的加密算法

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

// 取公钥匙对象

PublicKey pubKey = keyFactory.generatePublic(keySpec);

Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);

signature.initVerify(pubKey);

signature.update(data);

// 验证签名是否正常

return signature.verify(decryptBASE64(sign));

}

/**

* 解密

* 用私钥解密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {

// 对密钥解密

byte[] keyBytes = decryptBASE64(key);

// 取得私钥

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

// 对数据解密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, privateKey);

return cipher.doFinal(data);

}

/**

* 解密

* 用公钥解密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception {

// 对密钥解密

byte[] keyBytes = decryptBASE64(key);

// 取得公钥

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

Key publicKey = keyFactory.generatePublic(x509KeySpec);

// 对数据解密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, publicKey);

return cipher.doFinal(data);

}

/**

* 加密

* 用公钥加密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {

// 对公钥解密

byte[] keyBytes = decryptBASE64(key);

// 取得公钥

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

Key publicKey = keyFactory.generatePublic(x509KeySpec);

// 对数据加密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

return cipher.doFinal(data);

}

/**

* 加密

* 用私钥加密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception {

// 对密钥解密

byte[] keyBytes = decryptBASE64(key);

// 取得私钥

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

// 对数据加密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, privateKey);

return cipher.doFinal(data);

}

/**

* 取得私钥

*

* @param keyMap

* @return

* @throws Exception

*/

public static String getPrivateKey(Map keyMap) throws Exception {

Key key = (Key) keyMap.get(PRIVATE_KEY);

return encryptBASE64(key.getEncoded());

}

/**

* 取得公钥

*

* @param keyMap

* @return

* @throws Exception

*/

public static String getPublicKey(Map keyMap) throws Exception {

Key key = (Key) keyMap.get(PUBLIC_KEY);

return encryptBASE64(key.getEncoded());

}

/**

* 初始化密钥

*

* @return

* @throws Exception

*/

public static Map initKey() throws Exception {

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);

keyPairGen.initialize(1024);

KeyPair keyPair = keyPairGen.generateKeyPair();

// 公钥

RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

// 私钥

RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

Map keyMap = new HashMap(2);

keyMap.put(PUBLIC_KEY, publicKey);

keyMap.put(PRIVATE_KEY, privateKey);

return keyMap;

}

}

CryptoUtil.java

package com.xxx.security;

import java.security.MessageDigest;

import java.util.UUID;

import org.eclipse.jetty.util.security.Credential.MD5;

/**

* 加密工具类

*/

public class CryptoUtil {

private CryptoUtil() {

}

public static String SHA256(String str) {

MessageDigest messageDigest;

String encodeStr = "";

try {

messageDigest = MessageDigest.getInstance("SHA-256");

messageDigest.update(str.getBytes("UTF-8"));

encodeStr = byte2Hex(messageDigest.digest());

} catch (Exception e) {

System.out.println("getSHA256 is error" + e.getMessage());

}

return encodeStr;

}

public static String MD5(String str) {

String resultStr = MD5.digest(str);

return resultStr.substring(4, resultStr.length());

}

public static String UUID() {

return UUID.randomUUID().toString().replaceAll("\\-", "");

}

private static String byte2Hex(byte[] bytes) {

StringBuilder builder = new StringBuilder();

String temp;

for (int i = 0; i < bytes.length; i++) {

temp = Integer.toHexString(bytes[i] & 0xFF);

if (temp.length() == 1) {

builder.append("0");

}

builder.append(temp);

}

return builder.toString();

}

}

Coder.java

package com.xxx.security;

import java.security.MessageDigest;

import javax.crypto.KeyGenerator;

import javax.crypto.Mac;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

/**

* 基础加密组件

*

*/

public abstract class Coder {

public static final String KEY_SHA = "SHA";

public static final String KEY_MD5 = "MD5";

/**

* MAC算法可选以下多种算法

*

*

 
 

* HmacMD5

* HmacSHA1

* HmacSHA256

* HmacSHA384

* HmacSHA512

*

*/

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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件介绍 本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全性大大提升! 众所周知,java编译后的class文件是一种间字节字文件, 很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式, 但这样会带来很多麻烦,而且也不能真正保护class文件, 本工具是对class文件进行加密,采用jni的方式解密运行, 加密算法达到256位,加密后的class文件不可能被破解,反编译工具也对加密后的class文件无能为力。 运行方式: 运行时,要能正确的加载加密后的class文件, 必须使用我们提供的动态链接库classloader.dll(windows操作系统)或者libclassloader.so(Linux、Unix操作系统)。 执行java时带上参数-agentlib:\classloader 注意此处不要后缀名.dll(或者.so)。 如: 我把classloader.dll放在C:\目录下; 运行加密后的class文件命令如下: windows下执行javajava -agentlib:C:\classloader Sample Linux、Unix等系列操作系统下执行javajava -agentlib:/home/classloader Sample 或者把libclassloader.so拷贝到如“/home/yzj/jdk1.6.0_23/jre/lib/i386/”这jdk的运行目录下, 然后执行java如:java -agentlib:classloader Sample 当然如果class文件没加密,这样运行也不会出错! 应用场合: 独立的应用程序,运行java时,带上参数-agentlib:\classloader Tomcat、Jboss等Java application server修改启动脚本, 把执行java的命令行后面加上参数-agentlib:\classloader 适应环境: 操作系统:所有操作系统,Windows系统、Linux/Unix,只是运行时, 使用的动态链接库文件不一样而已,其它配置完全一样。 jdk必须1.5以上。 备注:如果下载站下载下来的程序有运行bug,请从上面两个下载地址更新软件。并给我们留言!谢谢... 升级提示:v2.1相比v2.0修改了一个注册bug。
Java加密Cipher是一个非常重要的,用于加密和解密数据。它是Java Cryptography Architecture (JCA)的一部分,提供了许多加密算法的实现,如DES、AES、RSA等。下面是Cipher的使用方法: 1. 创建Cipher对象:Cipher对象是通过调用Cipher.getInstance()方法创建的。需要传入一个加密算法的名称,如AES、DES等。 ```java Cipher cipher = Cipher.getInstance("AES"); ``` 2. 初始化Cipher对象:Cipher对象需要被初始化为加密模式或解密模式。可以通过调用init()方法实现。需要传入一个密钥和一个模式参数,如加密模式(Cipher.ENCRYPT_MODE)或解密模式(Cipher.DECRYPT_MODE)。 ```java Key key = new SecretKeySpec(keyBytes, "AES"); cipher.init(Cipher.ENCRYPT_MODE, key); ``` 3. 加密或解密数据:使用已经初始化的Cipher对象,可以使用doFinal()方法来加密或解密数据。需要传入要加密或解密的数据。 ```java byte[] encryptedData = cipher.doFinal(plainText.getBytes()); ``` 完整的加密和解密示例代码如下: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.security.Key; public class CipherExample { public static void main(String[] args) throws Exception { String plainText = "hello world"; byte[] keyBytes = "0123456789abcdef".getBytes(); // Create cipher object Cipher cipher = Cipher.getInstance("AES"); // Initialize cipher object Key key = new SecretKeySpec(keyBytes, "AES"); cipher.init(Cipher.ENCRYPT_MODE, key); // Encrypt data byte[] encryptedData = cipher.doFinal(plainText.getBytes()); System.out.println("Encrypted data: " + new String(encryptedData)); // Initialize cipher object for decryption cipher.init(Cipher.DECRYPT_MODE, key); // Decrypt data byte[] decryptedData = cipher.doFinal(encryptedData); System.out.println("Decrypted data: " + new String(decryptedData)); } } ``` 上述代码使用AES算法加密和解密数据。注意,密钥的长度必须是16个字节。如果需要使用其他算法或长度的密钥,需要进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值