从数据安全谈起

 
    当你使用网银时,是否担心你的银行卡会被盗用?
    当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露?
    作为开发者,编写安全的代码比编写优雅的代码更重要,因为安全是一切应用之根本!为了确保数据不被侵犯,数据加密/解密技术运用而生。    ——摘录自《Java加密解密的艺术》
 
    所以为了确保数据传输和数据存储的安全,我们可以通过特定的算法,将数据明文加密成复杂的密文。
    众多的加密手段大致可以分为单项加密和双向加密。单项加密指通过对数据进行摘要计算生成密文,密文不可逆推还原,比如有Base64、MD5、SHA等;双向加密则相反,指可以把密文逆推还原成明文,其中双向加密又分为对称加密和非对称加密。对称加密是指数据使用者必须拥有同样的密钥才可以进行加密解密,就像大家共同约定了一组暗号一样,对称加密的手段有DES、3DES、AES、IDEA、RC4、RC5等;而非对称加密相对于对称加密而言,无需拥有同一组密钥,它是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能进行解密。此类的加密手段有RSA、DSA等。
                                                                                            
【密码学常用术语】
    明文:未加密的数据
    密文:明文经过加密后的数据
    加密:将明文转换为密文的过程
    解密:将密文转换为明文的过程    
    加密算法:将明文转换为密文的转换算法        
    解密算法:将密文转换为明文的转换算法
    加密密钥:用于加密算法进行加密操作的密钥
    解密密钥:用于解密算法进行解密操作的密钥
    
 
 
初识3DES

    3DES,也称为3DESede或TripleDES,是三重数据加密,且可以逆推的一种算法方案。
    1975年美国IBM公司成功研究并发布了DES加密算法,但DES密码长度容易被暴力破解,通过对DES算法进行改进,针对每个数据块进行三次DES加密,也就是3DES加密算法。
    但由于3DES的算法是公开的,所以算法本身没什么秘密可言,主要依靠唯一密钥来确保数据加密解密的安全。
    有人可能会问,那3DES到底安不安全呢?!目前为止,还没有人能破解3DES,所以你要是能破解它,都足以震惊整个信息安全界了……
 
【Java使用3DES加密解密的流程】
    ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象
        SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);    
    ②根据算法实例化Cipher对象。它负责加密/解密
        Cipher c1 = Cipher.getInstance(Algorithm);    
    ③传入加密/解密模式以及SecretKey密钥对象,实例化Cipher对象
        c1.init(Cipher.ENCRYPT_MODE, deskey);    
    ④传入字节数组,调用Cipher.doFinal()方法,实现加密/解密,并返回一个byte字节数组
        c1.doFinal(src);
 
 
 
3DES案例

 
—SecretUtils.java(3DES加密解密的工具类)—
 1 package my3des;
2
3 import java.io.UnsupportedEncodingException;
4
5 import javax.crypto.Cipher;
6 import javax.crypto.SecretKey;
7 import javax.crypto.spec.SecretKeySpec;
8
9
10 /**
11 * SecretUtils {3DES加密解密的工具类 }
12 * @author William
13 * @date 2013-04-19
14 */
15 public class SecretUtils {
16
17 //定义加密算法,有DES、DESede(即3DES)、Blowfish
18 private static final String Algorithm = "DESede";
19 private static final String PASSWORD_CRYPT_KEY = "2012PinganVitality075522628888ForShenZhenBelter075561869839";
20
21
22 /**
23 * 加密方法
24 * @param src 源数据的字节数组
25 * @return
26 */
27 public static byte[] encryptMode(byte[] src) {
28 try {
29 SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm); //生成密钥
30 Cipher c1 = Cipher.getInstance(Algorithm); //实例化负责加密/解密的Cipher工具类
31 c1.init(Cipher.ENCRYPT_MODE, deskey); //初始化为加密模式
32 return c1.doFinal(src);
33 } catch (java.security.NoSuchAlgorithmException e1) {
34 e1.printStackTrace();
35 } catch (javax.crypto.NoSuchPaddingException e2) {
36 e2.printStackTrace();
37 } catch (java.lang.Exception e3) {
38 e3.printStackTrace();
39 }
40 return null;
41 }
42
43
44 /**
45 * 解密函数
46 * @param src 密文的字节数组
47 * @return
48 */
49 public static byte[] decryptMode(byte[] src) {
50 try {
51 SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);
52 Cipher c1 = Cipher.getInstance(Algorithm);
53 c1.init(Cipher.DECRYPT_MODE, deskey); //初始化为解密模式
54 return c1.doFinal(src);
55 } catch (java.security.NoSuchAlgorithmException e1) {
56 e1.printStackTrace();
57 } catch (javax.crypto.NoSuchPaddingException e2) {
58 e2.printStackTrace();
59 } catch (java.lang.Exception e3) {
60 e3.printStackTrace();
61 }
62 return null;
63 }
64
65
66 /*
67 * 根据字符串生成密钥字节数组
68 * @param keyStr 密钥字符串
69 * @return
70 * @throws UnsupportedEncodingException
71 */
72 public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException{
73 byte[] key = new byte[24]; //声明一个24位的字节数组,默认里面都是0
74 byte[] temp = keyStr.getBytes("UTF-8"); //将字符串转成字节数组
75
76 /*
77 * 执行数组拷贝
78 * System.arraycopy(源数组,从源数组哪里开始拷贝,目标数组,拷贝多少位)
79 */
80 if(key.length > temp.length){
81 //如果temp不够24位,则拷贝temp数组整个长度的内容到key数组中
82 System.arraycopy(temp, 0, key, 0, temp.length);
83 }else{
84 //如果temp大于24位,则拷贝temp数组24个长度的内容到key数组中
85 System.arraycopy(temp, 0, key, 0, key.length);
86 }
87 return key;
88 }
89 }
—Main.java(测试类)—
 1 package my3des;
2
3 public class Main {
4
5 /**
6 * @param args
7 */
8 public static void main(String[] args) {
9 String msg = "3DES加密解密案例";
10 System.out.println("【加密前】:" + msg);
11
12 //加密
13 byte[] secretArr = SecretUtils.encryptMode(msg.getBytes());
14 System.out.println("【加密后】:" + new String(secretArr));
15
16 //解密
17 byte[] myMsgArr = SecretUtils.decryptMode(secretArr);
18 System.out.println("【解密后】:" + new String(myMsgArr));
19 }
20 }
 
 
补充说明

· 3DES的密钥必须是24位的byte数组
    随便拿一个String.getBytes()是不行的,会报如下错误
        java.security.InvalidKeyException: Invalid key length: 59 bytes
    解决方法有很多,①按密钥固定长度重新定义字符串;②先把字符串用Base64或者MD5加密,然后截取固定长度的字符转成byte数组;③字符串转成Byte数组,针对该数组进行修改,若长度过长则只截取一部分,若长度不够则补零
 
· 加密结果的编码方式要一致
    从byte数组转成字符串,一般有两种方式,base64处理和十六进制处理。
    

◆JAVA加密解密-3DES的更多相关文章

  1. Java加密解密大全

    ChinaSEI系列讲义(By 郭克华)   Java加密解密方法大全                     如果有文字等小错,请多包涵.在不盈利的情况下,欢迎免费传播. 版权所有.郭克华 本讲义经 ...

  2. java加密解密的学习

    注:此文章只是对如何学习java加密解密技术做一个讲解.并不涉及具体的知识介绍,如果有需要请留言,有时间我补冲长.个人觉着学习一个学习方法比学习一个知识点更有价值的多. 首先,对于加密解密知识体系没有 ...

  3. Java加密解密字符串

    http://www.cnblogs.com/vwpolo/archive/2012/07/18/2597232.html Java加密解密字符串   旧文重发:http://www.blogjava ...

  4. java加密解密

    java加密解密 public class MD5Util { /** * @param args */ public static void main(String[] args) { System ...

  5. password学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)

    Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又称为数字摘要(Digital Digest). 它是一个唯一相应一个消息或文本的固定长度 ...

  6. java加密解密算法位运算

    一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算 ...

  7. java加密-解密小结

    加密算法可以分为 双向加密(对称加密.不对称加密) 单向加密(不可逆加密)—— MD5.sha.hmac... 在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密 有: ...

  8. Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

    版权声明:本文为博主原创文章,未经博主允许不得转载. [前言] 本文简单的介绍了加密技术相关概念,最后总结了java中现有的加密技术以及使用方法和例子 [最简单的加密] 1.简单的概念 明文:加密前的 ...

  9. java-信息安全(十八)java加密解密,签名等总结

    一.基本概念 加密: 密码常用术语: 明文,密文,加密,加密算法,加密秘钥,解密,解密算法,解密秘钥, 密码分析:分析密文从而推断出明文或秘钥的过程 主动攻击:入侵密码系统,采用伪造,修改,删除等手段 ...

随机推荐

  1. Python中去除字符串中的单个或多个空格的方法总结

    python中去除字符串中空格的方法比较多,单个看起来也都比较简单 但是使用起来容易发生混淆 为了加深记忆 将常用的去除字符串中空格的方法汇总如下 方法一:strip()方法 >>> ...

  2. [flask] jinja自定义filter来过滤html标签

    问题描述 数据库存储了html格式的博客文章,在主页(index)显示的时候带有html标签,如何过滤掉呢? 解决方案 用jinja自定义filter过滤掉html标签 我是用的工厂函数,因此在工厂函 ...

  3. JVM调优工具锦囊

    Arthas线上 分析诊断调优工具 以前我们要排查线上问题,通常使用的是jdk自带的调优工具和命令.最常见的就是dump线上日志,然后下载到本地,导入到jvisualvm工具中.这样操作有诸多不变,现 ...

  4. 曼孚科技:“四管齐下”筑牢AI数据隐私安全防线

    谈及数据,绕不开的一个话题就是数据隐私与数据安全.随着数字化进程加快,数据安全事件频发,据Risk Based Security统计,去年国际数据泄露事件近5000起,被泄露数据近41亿条,数据造成的 ...

  5. 【Java】单例设计模式

    文章目录 单例设计模式 什么是设计模式 单例设计模式 实现 饿汉式 懒汉式 饿汉式与懒汉式的区别 饿汉式 懒汉式 单例模式的应用场景 单例设计模式 什么是设计模式 设计模式是在大量的实践中总结和理论化 ...

  6. Hadoop 代码实现文件上传

    本项目主要实现Windows下利用代码实现Hadoop中文件上传至HDFS 实现上传文本文件中单词个数的计数 1.项目结构 2.相关代码 CopyFromLocalFile 1 package com ...

  7. 使用Xamarin开发移动应用示例——数独游戏(一)项目的创建与调试

    最近项目中需要移动客户端,由于团队基本上使用.Net产品线,所以决定使用Xmarin进行开发,这样技术路线统一,便于后期维护.官网上是这样介绍的" Xamarin 允许你使用 .NET 代码 ...

  8. golang中结构体中的嵌套

    package main import "fmt" type Base struct { name string } func (b *Base) m1() int { retur ...

  9. Ubuntu18.04 显卡驱动安装(解决各种疑难杂症)

    步骤 下载驱动 准备工作 进行安装 检查安装 下载驱动 首先我们需要去官网下载显卡驱动 打开浏览器,在百度搜索框中搜索:显卡驱动 下载 在手动搜索驱动程序一栏,根据自己的显卡进行选择 产品系列中,No ...

  10. Luogu P1314 [NOIP2011 提高组] 聪明的质监员

    P1314 [NOIP2011 提高组] 聪明的质监员 题意 题目描述 给定\(n\)个物品,给定每个物品的 重量 \(w_i\) 和 价值 \(v_i\) 给定一个标准值 \(s\) 以及一个参数 ...