Java安全之对称加密、非对称加密、数字签名

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 转贴: http://www.cnblogs.com/duanxz/p/3195098.htmlJava中加密分为两种方式一个是对称加密,另一个是非对称加密。对称加密是因为加密和解密的钥匙相同,而非对称加密是加密和解密的钥匙不同。

转贴: http://www.cnblogs.com/duanxz/p/3195098.html

Java中加密分为两种方式一个是对称加密,另一个是非对称加密。对称加密是因为加密和解密的钥匙相同,而非对称加密是加密和解密的钥匙不同。

对称加密与非对称加密的区别:

对称加密称为密钥加密,速度快,但加密和解密的钥匙必须相同,只有通信双方才能知道密钥。

非对称加密称为公钥加密,算法更加复杂,速度慢,加密和解密钥匙不相同,任何人都可以知道公钥,只有一个人持有私钥可以解密。

对称加密解密:

 
	/*
	 * 对称加密
	 */
	private static void secretEncrypt() throws Exception {
		//使用Cipher的实例
		Cipher cipher =Cipher.getInstance("AES");
		
		//得到加密的钥匙
		SecretKey key =KeyGenerator.getInstance("AES").generateKey();
		
		//初始化加密操作,传递加密的钥匙
		cipher.init(Cipher.ENCRYPT_MODE,key);
		
		//将加密的钥匙写入secretKey.key文件中
		FileOutputStream fosKey=new FileOutputStream("secretKey.key");
		ObjectOutputStream oosSecretKey =new ObjectOutputStream(fosKey);
		oosSecretKey.writeObject(key);
		oosSecretKey.close();
		fosKey.close();
		 
		 //将加密的内容传递进去,返回加密后的二进制数据
		byte [] results =cipher.doFinal("哈哈哈哈哈".getBytes());
		
		//将加密后的二进制数据写入到secretContent.dat文件中
		FileOutputStream fosData=new FileOutputStream("secretContent.dat");
		fosData.write(results);
		fosData.close();
	}
	
	/*
	 * 对称解密
	 */
	private static void secretDecrypt() throws Exception{
		Cipher cipher =Cipher.getInstance("AES");
		
		//获取文件中的key进行解密
		FileInputStream fisKey=new FileInputStream("secretKey.key");
		ObjectInputStream oisKey =new ObjectInputStream(fisKey);
		Key key =(Key)oisKey.readObject();
		oisKey.close();
		fisKey.close();
		
		//初始化解密操作,传递加密的钥匙
		cipher.init(Cipher.DECRYPT_MODE,key);
		
		//获取文件中的二进制数据
		FileInputStream fisDat=new FileInputStream("secretContent.dat");
		//获取数据第一种方式
		byte [] src=new byte [fisDat.available()];
		int len =fisDat.read(src);
		int total =0;
		while(total<src.length){
			total +=len;
			len=fisDat.read(src,total,src.length-total);
		}
		//执行解密
		byte [] result=cipher.doFinal(src);
		fisDat.close();
		System.out.println(new String(result));
		
//		读文件中的数据第二种方式
//		ByteArrayOutputStream baos =new ByteArrayOutputStream();
//		copyStream(fisDat, baos);
//		byte [] result=cipher.doFinal(baos.toByteArray());
//		fisDat.close();
//		baos.close();
	}
	
//	private static void copyStream(InputStream ips,OutputStream ops) throws Exception{
//		byte [] buf =new byte[1024];
//		int len=ips.read(buf);
//		while(len!=-1){
//			ops.write(buf,0,len);
//			len  =ips.read(buf);
//		}
//	}

基于口令的对称加密与解密

系统自动生成的Key不容易记忆,我们可以使用我们容易记忆的口令同过java自带的一个工具将它转换成Key,在解密的时候我们就可以通过口令进行解密。

	/*
	 * 基于口令的对称加密
	 */
	private static void secretEncrypt() throws Exception {
		//实例化工具
		Cipher cipher2=Cipher.getInstance("PBEWithMD5AndDES");
		
		//使用该工具将基于密码的形式生成Key
		SecretKey key2=SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec("123".toCharArray()));
		PBEParameterSpec parameterspec=new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000);
		
		//初始化加密操作,同时传递加密的算法
		cipher2.init(Cipher.ENCRYPT_MODE,key2,parameterspec);
		
		 //将要加密的数据传递进去,返回加密后的数据
		byte [] results =cipher2.doFinal("哈哈哈哈哈".getBytes());
		
		//将加密后的数据写入到文件中
		FileOutputStream fosData=new FileOutputStream("zxx.dat");
		fosData.write(results);
		fosData.close();
	}
	
	/*
	 * 基于口令的对称解密
	 */
	private static void secretDecrypt() throws Exception{
		Cipher cipher2=Cipher.getInstance("PBEWithMD5AndDES");
		SecretKey key2=SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec("123".toCharArray()));
		PBEParameterSpec parameterspec=new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000);
		cipher2.init(Cipher.DECRYPT_MODE,key2,parameterspec);
		FileInputStream fisDat=new FileInputStream("zxx.dat");
		byte [] src=new byte [fisDat.available()];
		int len =fisDat.read(src);
		int total =0;
		while(total<src.length){
			total +=len;
			len=fisDat.read(src,total,src.length-total);
		}
		byte [] result=cipher2.doFinal(src);
		fisDat.close();
		System.out.println(new String(result));
	}

非对称加密解密:

非对称加密是公钥加密,私钥来解密,这个个人做用的少一点,主要针对于大型的网站大型的企业

	/*
	 * 公钥加密
	 */
	private static void PublicEnrypt()throws Exception {
		Cipher cipher =Cipher.getInstance("RSA");
		//实例化Key
		KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
		//获取一对钥匙
		KeyPair keyPair=keyPairGenerator.generateKeyPair();
		//获得公钥
		Key publicKey=keyPair.getPublic();
		//获得私钥 
		Key privateKey=keyPair.getPrivate();
		//用公钥加密
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		byte [] result=cipher.doFinal("传智播客".getBytes("UTF-8"));
		//将Key写入到文件
		saveKey(privateKey,"zxx_private.key");
		//加密后的数据写入到文件
		saveData(result,"public_encryt.dat");
	}
	
	/*
	 * 私钥解密
	 */
	private static void privateDecrypt() throws Exception {
		Cipher cipher=Cipher.getInstance("RSA");
		//得到Key
		Key privateKey=readKey("zxx_private.key");
		//用私钥去解密
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		//读数据源
		byte [] src =readData("public_encryt.dat");
		//得到解密后的结果
		byte[] result=cipher.doFinal(src);
		//二进制数据要变成字符串需解码
		System.out.println(new String(result,"UTF-8"));
	}

	private static void saveData(byte[] result, String fileName) throws Exception {
		// TODO Auto-generated method stub
		FileOutputStream fosData=new FileOutputStream(fileName);
		fosData.write(result);
		fosData.close();
	}
	public static void saveKey(Key key,String fileName)throws Exception{
		FileOutputStream fosKey=new FileOutputStream(fileName);
		ObjectOutputStream oosSecretKey =new ObjectOutputStream(fosKey);
		oosSecretKey.writeObject(key);
		oosSecretKey.close();
		fosKey.close();
	}
	private static Key readKey(String fileName) throws Exception {
		FileInputStream fisKey=new FileInputStream(fileName);
		ObjectInputStream oisKey =new ObjectInputStream(fisKey);
		Key key=(Key)oisKey.readObject();
		oisKey.close();
		fisKey.close();
		return key;
	}
	private static byte[] readData(String filename) throws Exception {
		FileInputStream fisDat=new FileInputStream(filename);
		byte [] src=new byte [fisDat.available()];
		int len =fisDat.read(src);
		int total =0;
		while(total<src.length){
			total +=len;
			len=fisDat.read(src,total,src.length-total);
		}
		fisDat.close();
		return src;
	}

数字签名:

数字签名的基础是公钥和私钥的非对称加密,发送者使用私钥加密的消息摘要(签名),接收者使用公钥解密消息摘要以验证签名是否是某个人。

要证明这段数据是你发过来的,并且没有被别人改过,这就需要用到数字签名,首先我们对整个文档进行md5加密得到16个字节,然后把消息摘要和文档发过去,解密者首先对发过来的文档进行解密,解密后得到一个摘要(md5),对接收的文档进行md5加密,得到的md5结果匹配解密后的摘要,如果匹配成功的话证明没有修改过,我们使用Signature进行签名

	/* 
	 * 使用私钥签名 
	 */  
	private static void sign()throws Exception {  
	    //实例化Key   
	    KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");  
	    //获取一对钥匙   
	    KeyPair keyPair=keyPairGenerator.generateKeyPair();  
	    //获得公钥   
	    PublicKey publicKey=keyPair.getPublic();  
	    //获得私钥    
	    PrivateKey privateKey=keyPair.getPrivate();  
	    
	    //数字签名
	    Signature signature =Signature.getInstance("SHA1withRSA");
	    signature.initSign(privateKey);//用私钥签名
	    signature.update("这里签名".getBytes());//对怎样的数据进行签名
	    byte [] sign=signature.sign();  //获取签名的结果
	    
	    //保存公钥并写入文件中 
	    saveKey(publicKey,"zxx_private.key");  
	    //将签名后的数据写入到文件   
	    saveData(sign,"public_encryt.dat");  
	}
	  
	/* 
	 * 公钥解密 
	 */  
	private static void verify() throws Exception {  
		Signature signture =Signature.getInstance("SHA1withRSA");
		//获取到公钥
		PublicKey publicKey=(PublicKey)readKey("zxx_private.key");
		//初始化校验
		signture.initVerify(publicKey);
		//初始化签名对象
		signture.update("这里签名".getBytes());
		//读数据源   
	    byte [] sign =readData("public_encryt.dat");  
	    //返回匹配结果
		boolean isYouSigned=signture.verify(sign);
		//如果返回数据为true则数据没有发生修改,否则发生修改
		System.out.println(isYouSigned);
	} 


目录
相关文章
|
24天前
|
存储 安全 数据安全/隐私保护
Codota的数据加密技术包括静态数据加密和传输中的数据加密
Codota的数据加密技术包括静态数据加密和传输中的数据加密
45 4
|
23天前
|
安全 数据库 数据安全/隐私保护
对称加密与非对称加密的区别
对称加密与非对称加密的区别
186 64
|
1月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
52 4
|
15天前
|
Java 数据安全/隐私保护
对称加密、非对称加密、哈希摘要
对称加密使用同一密钥进行加解密,速度快但需保密;非对称加密采用公钥加密、私钥解密,公钥可公开,安全性高但速度较慢,双向通信需双方各持一对密钥;哈希摘要是从数据中提取特征,用于数据完整性校验,不同数据的哈希值几乎不会相同。
29 0
|
20天前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
35 0
|
2月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
119 2
|
2月前
|
安全 Java 编译器
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
|
2月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
191 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
2月前
|
安全 网络协议 网络安全
【HTTPS】对称加密和非对称加密
【HTTPS】对称加密和非对称加密
40 0
|
13天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。