前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >啥?前后端数据到现在还是明文的?DES与3DES 加解密了解一下

啥?前后端数据到现在还是明文的?DES与3DES 加解密了解一下

作者头像
周三不加班
发布2019-09-03 10:25:15
8770
发布2019-09-03 10:25:15
举报
文章被收录于专栏:程序猿杂货铺程序猿杂货铺

DES和3DES的概念

DES

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。

3DES

3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。

需求背景

我们在线上经常使用DES加密用户id,以下简称(encodeId),后端传给前端,前端会使用localStorage保存encodeId,然后调用接口时将encodeId作为入参,后端通过encodeId区分每个用户,返回前端相应数据,但是DES加密有被破解的报道,现在使用3DES对用户id,身份证号等敏感信息进行加解密,暂时没有被攻破的记录,3DES比DES更安全。(仅供参考)

DES和3DES工具类

DESUtils

所使用的jar包都是JDK8自带的,不需要其它依赖。

代码语言:javascript
复制
package com.cn.dl.utils;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class DESUtils {

    //秘钥
    private static final String KEY = "~@#$y1a2n.&@+n@$%*(1)";
    //加密算法
    private static final String  ALGORITHM = "DES";
    //编码
    private static final String CHARSET = "UTF-8";

    /**
     * byte数组转换成十六进制字符串
     * @param bytes byte数组
     * @return
     */
    private static String bytesToHexStr(byte[] bytes) {
        String tmp = "";
        StringBuilder sb = new StringBuilder("");
        for (int i = ; i < bytes.length; i++) {
            tmp = Integer.toHexString(bytes[i] & 0xFF);
            sb.append((tmp.length() == ) ? "0" + tmp : tmp);
        }
        return sb.toString().toUpperCase().trim();
    }
    /**
     * 十六进制字符串转成byte数组
     * @param hexStr   十六进制字符串
     * @return
     * */
    private static byte[] hexStrToBytes(String hexStr) {
        byte[] bytes = new byte[hexStr.length() / ];
        for (int i = ; i < bytes.length; i++) {
            bytes[i] = (byte) Integer.parseInt(hexStr.substring( * i,  * i + ), );
        }
        return bytes;
    }
    /**
     * @param key   秘钥
     * @param encodeStr  需要加密的字符串
     * @return
     */
    public static String encodeDES(String key, String encodeStr) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKey secretKey = SecretKeyFactory.getInstance(ALGORITHM).generateSecret(new DESKeySpec(key.getBytes()));
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encrypted = cipher.doFinal(encodeStr.getBytes(CHARSET));
        return bytesToHexStr(encrypted);
    }

    /**
     * @param key          秘钥
     * @param decodeStr   需要解密的字符串
     * @return
     */
    public static String decodeDES(String key, String decodeStr) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKey secretKey = SecretKeyFactory.getInstance(ALGORITHM).generateSecret(new DESKeySpec(key.getBytes()));
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decodedString = cipher.doFinal(hexStrToBytes(decodeStr));
        return new String(decodedString, CHARSET);
    }


    public static void main(String[] args) throws Exception {
        String userId = "13240115";
        String encode = DESUtils.encodeDES(KEY, userId);
        String decode = DESUtils.decodeDES(KEY, encode);
        System.out.println("用户id>>>"+userId);
        System.out.println("用户id加密>>>"+encode);
        System.out.println("用户id解密>>>"+decode);
    }
}

测试结果:

代码语言:javascript
复制
用户id>>>
用户id加密>>>BBE8100F9C6E5E6438C40FCC3B03DA
用户id解密>>>

2、DESedeUtil

需要引入jar包

代码语言:javascript
复制
<dependency>
     <groupId>commons-codec</groupId>
     <artifactId>commons-codec</artifactId>
     <version>1.11</version>
</dependency>
代码语言:javascript
复制
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;

import java.io.UnsupportedEncodingException;


/**
 * 3DES加密算法,主要用于加密用户id,身份证号等敏感信息,防止破解
 * Created by yanshao on 2018/12/10.
 */
public class DESedeUtil {

    //秘钥
    private static final String  KEY = "~@#$y1a2n.&@+n@$%*(1)";
    //秘钥长度
    private static final int secretKeyLength = ;
    //加密算法
    private static final String  ALGORITHM = "DESede";
    //编码
    private static final String CHARSET = "UTF-8";

    /**
     * 转换成十六进制字符串
     * @param key
     * @return
     */
    public static byte[] getHex(String key){
        byte[] secretKeyByte = new byte[];
        try {
            byte[] hexByte;
            hexByte = new String(DigestUtils.md5Hex(key)).getBytes(CHARSET);
            //秘钥长度固定为24位
            System.arraycopy(hexByte,,secretKeyByte,,secretKeyLength);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return secretKeyByte;
    }

    /**
     * 生成密钥,返回加密串
     * @param key 密钥
     * @param encodeStr 将加密的字符串
     * @return
     */
    public static String  encode3DES(String key,String encodeStr){
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(getHex(key), ALGORITHM));
            return Base64.encodeBase64String(cipher.doFinal(encodeStr.getBytes(CHARSET)));
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 生成密钥,解密,并返回字符串
     * @param key 密钥
     * @param decodeStr 需要解密的字符串
     * @return
     */
    public static String decode3DES(String key, String decodeStr){
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(getHex(key),ALGORITHM));
            return new String(cipher.doFinal(new Base64().decode(decodeStr)),CHARSET);
        } catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) {
        String userId = "13240115";
        String encode = DESedeUtil.encode3DES(KEY, userId);
        String decode = DESedeUtil.decode3DES(KEY, encode);
        System.out.println("用户id>>>"+userId);
        System.out.println("用户id加密>>>"+encode);
        System.out.println("用户id解密>>>"+decode);
    }

}

测试结果:

代码语言:javascript
复制
用户id>>>
用户id加密>>>bv6ZVR6KAunqORpY1fpOwQ==
用户id解密>>>
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员啊粥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DES和3DES的概念
    • DES
      • 3DES
      • 需求背景
      • DES和3DES工具类
        • DESUtils
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档