DES加密解密算法(前端&后端)_des加密解密算法(前端&后端)_前端desc加密 后端解密-csdn博客-程序员宅基地

技术标签: DES  

DES加密解密算法(前端&后端)

 

原作者 阿弥陀佛1114  原文链接:https://blog.csdn.net/zong1114/article/details/51754470

   

DES对称加密,是一种对称加密算法。具体原理等随便百度一下就有一大堆。

 

在实际应用当中,经常会遇到这样的场景:用户管理中用户的登录密码以密文的形式保存在数据库中,用户在前端登录时,系统在前端将用户填写的密码进行DES加密,将密文传递到后台再与数据库中保存的密码进行对比,如果一致则允许登录,如果不一致则不允许登录。在这个场景中,不可避免的会运用到使用js方式和java代码方式对密码进行DES加密和解密的应用。

 

废话不多说,这里我们前端密码的DES加密使用CryptoJS框架。CryptoJS 为 JavaScript 提供了各种各样的加密算法。目前已支持的算法包括: DES MD5 SHA-1 SHA-256 AES Rabbit MARC4 HMAC HMAC-MD5 HMAC-SHA等。如果要使用CryptoJS中的DES加密解密功能,需要在页面中引入两个js文件。

 

引入JS如下

<script type="text/javascript" src="<%=basePath%>/cryptoJS/rollups/tripledes.js" charset="UTF-8"></script>
<script type="text/javascript" src="<%=basePath%>/cryptoJS/components/mode-ecb.js" charset="UTF-8"></script>

 

前端页面如下

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <base href="<%=basePath%>">
        <title>My JSP 'index.jsp' starting page</title>
    </head>
    <script type="text/javascript" src="/cryptoJS/rollups/tripledes.js" charset="UTF-8"></script>
    <script type="text/javascript" src="/cryptoJS/components/mode-ecb.js" charset="UTF-8"></script>

    <body>
        <button onclick="init()">计算</button>
        <br>
    </body>

    <script type="text/javascript">
        function init(){

            var keyHex = CryptoJS.enc.Base64.parse('=BRCSECRETKEY=');

            var encrypted = CryptoJS.DES.encrypt('ORIGINAL TEXT INFO', keyHex, {
                mode: CryptoJS.mode.ECB,
                padding: CryptoJS.pad.Pkcs7
            });

            console.log(encrypted.toString());
            
            // direct decrypt ciphertext
            var decrypted = CryptoJS.DES.decrypt({
                    ciphertext: CryptoJS.enc.Base64.parse(encrypted.toString())
                }, keyHex, {
                    mode: CryptoJS.mode.ECB,
                    padding: CryptoJS.pad.Pkcs7
             });

            console.log(decrypted.toString(CryptoJS.enc.Utf8));
        }
    </script>
</html>

 

Java代码如下 【需要引用commons-codec-1.10.jar】

package cc.com;

import java.security.Key;
import java.security.SecureRandom;

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

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



/**
 * DES对称加密算法
 * @see 
 */
public class DESCoder {

    public static final String KEY_ALGORITHM = "DES";
    public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";

    /**
     * 生成密钥
     * @param seed 密钥
     * @return 字符串
     * @throws Exception 异常
     */
    public static String initkey() throws Exception {
        return initkey(null);
    }

    /**
     * 生成密钥
     * @param seed 密钥
     * @return 字符串
     * @throws Exception 异常
     */
    public static String initkey(String seed) throws Exception {
        SecureRandom secureRandom = null;

        if(seed != null){
            secureRandom = new SecureRandom(Base64.decodeBase64(seed));
        }else{
            secureRandom = new SecureRandom();
        }

        KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
        kg.init(secureRandom);
        SecretKey secretKey = kg.generateKey();

        return Base64.encodeBase64String(secretKey.getEncoded());
    }

    /**
     * 转换密钥
     */
    private static SecretKey toKey(byte[] key) throws Exception {
        DESKeySpec keySpec = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
        SecretKey secretKey = keyFactory.generateSecret(keySpec);
        return secretKey;
    }

    /**
     * 加密数据
     * @param data 待加密数据
     * @param key  密钥
     * @return 加密后的数据
     */
    public static String encrypt(String data, String key) throws Exception {
        Key k = toKey(Base64.decodeBase64(key));
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, k);
        byte[] encryptData = cipher.doFinal(data.getBytes());
        return Base64.encodeBase64String(encryptData);
    }

    /**
     * 解密数据
     * @param data 待解密数据
     * @param key  密钥
     * @return 解密后的数据
     */
    public static String decrypt(String data, String key) throws Exception {
        Key k = toKey(Base64.decodeBase64(key));
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, k);
        return new String(cipher.doFinal(Base64.decodeBase64(data)));
    }

    public static void main(String[] args) throws Exception {

        String source = "ORIGINAL TEXT INFO";
        System.out.println("原文: " + source);

        String key = "=BRCSECRETKEY=";
        System.out.println("密钥: " + key);

        String encryptData = encrypt(source, key);
        System.out.println("加密: " + encryptData);

        String decryptData = decrypt(encryptData, key);
        System.out.println("解密: " + decryptData);

    }
}

PS: 上面只是记录下js和java两种方式的DES加密解密方式,具体登录逻辑需要自己编码开发。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Aria_Miazzy/article/details/100269701

智能推荐

gossip-程序员宅基地

文章浏览阅读55次。celebrity ----a famous peopleobama ---- politicatonobject ----反对转载于:https://www.cnblogs.com/shenfengok/archive/2012/07/11/2586893.html

在linux中使用setns()设置pid namespace-程序员宅基地

文章浏览阅读3.1k次。以下代码展示了 setns() 的用法,#define _GNU_SOURCE#include <fcntl.h>#include <sched.h>#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/wait.h>#in_setns

可逆矩阵性质总结_线性代数下的行列式和矩阵-程序员宅基地

文章浏览阅读5.7k次。实际意义求线性方程组线性方程组一般有 m 个常数项,n 个未知数,m * n 个系数。若常数项全为 0 ,则为齐次线性方程组;若未知数全为 0 ,则称为零解。于是我们考虑的问题是:齐次方程组:是否存在非零解,以及存在的条件通解的结构与性质解法非齐次方程组:是否有解,以及有解的条件是什么有多少解以及对应解数量的条件是什么多解的结构与性质解法行列式二,三阶行列式行列式最初的作用就是求解线性方程组!例如..._可逆矩阵一定是实数矩阵吗

centos8的80端口不通问题记录_为什么keepalived连不上本地的80端口-程序员宅基地

文章浏览阅读5.2k次。1、首先是安装了nginx并启动了服务,查看80端口正常listening2、通过其他机器访问网页无法连接,查看telnet到80端口也不通。初步怀疑跟防火墙有关3、查看iptables,发现有部分默认规则,但都是accept。默认的filter表也都是accept,尝试用iptables -F清空规则表后问题依旧4、之前使用的是ubuntu系统,主要通过的就是iptables来控制..._为什么keepalived连不上本地的80端口

Mysql5.7安装 Gtid原理作用+主从复制_gtid在主从复制的作用-程序员宅基地

文章浏览阅读1.3k次,点赞4次,收藏3次。Gtid的作用Gtid,采用了新的复制协议,旧协议是,首先从服务器上在一个特定的偏移量位置连接到主服务器上一个给定的二进制日志文件,然后主服务器再从给定的连接点开始发送所有的事件。新协议有所不同,支持以全局统一事务ID(GTID)为基础的复制。当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务。GTID复制是全部以事务为基础,使得检查主从一致性变得非常简单。如果所有主库上提交的事务也同样提交到从库上,一致性就得到了保证。Gtid的工作原理1.当一个事务在主库端执行并提交时,产生GTID,一_gtid在主从复制的作用

Java 单例模式浅析_单例模式论文-程序员宅基地

文章浏览阅读229次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码_单例模式论文

随便推点

java 学习历程_ydb集成java-程序员宅基地

文章浏览阅读908次。基础稍差或零基础 : 视频学习周期建议为 20-30 天,具体根据学生自学能力,自行合理安排时间。 第一阶段: 初级(8-12 天) 点击下载 第一阶段:Java 初级 ● Java 开发前奏 ● Java 编程基础 ● 面向对象上 ● 面向对象下 ● 多线程 ● JavaA_ydb集成java

RPN 区域选取网络 region proposal network_region proposal networks ( rpn )翻译-程序员宅基地

文章浏览阅读663次。转:懒人元(侵删) 注:转自其他博客,仅供学习参考。  RPN全称是Region Proposal Network,RegionProposal的中文意思是“区域选取”,也就是“提取候选框”的意思,所以RPN就是用来提取候选框的网络。1. RPN的意义  RPN第一次出现在世人眼中是在Faster RCNN这个结构中,专门用来提取候选框,在RCNN和Fast RCNN等物体检测架构中,用来提取候选框的方法通常是Selective Search,是比较传统的方法,而且比较耗时,在CPU上要2s一.._region proposal networks ( rpn )翻译

stm32正常运行流程图_STM32单片机的基础知识77条!这个要收藏一下哦-程序员宅基地

文章浏览阅读1.5k次。1、 SYSCLK时钟源有三个来源:HSI RC、HSE OSC、PLL2、 MCO[2:0]可以提供4源不同的时钟同步信号,PA83、 GPIO口有两个反向串联的二极管用作钳位二极管。4、 ICode总线,DCode总线、系统总线、DMA总线、总线矩阵、AHB/APB桥5、在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟6、STM32复位有三种:系统复位、上电复位、备份区..._stm32主程序流程图

无处 不在的无线智能——6g 的关键驱动与研究挑战_一文看懂什么是 6G - 6G,5G-程序员宅基地

文章浏览阅读106次。2020年行将结束,随着5G网络的建设推进,以及3GPP R16版本的冻结,越来越多的人将关注焦点转移到6G身上。7月14日,韩国三星电子发布了白皮书《下一代超连接体验》。在白皮书中,三星预估6G标准完成及投入商业化的最早时间点是2028年,而大规模商业化可能发生在2030年左右。这个预测时间点,和3月17日全球第二届6G Wireless Summit会议上中兴通讯给出的预测时间点非常接近:从社..._6g无线智能无处不在的关键驱动与研究挑战

安装caffe过程中出现libtbb.so.2 undefined reference error_//usr/lib/x86_64-linux-gnu/libtbb.so.2:对‘__cxa_ini-程序员宅基地

文章浏览阅读768次。caffe 包是从caffe的github官网上下载的https://github.com/BVLC/caffe我是准备安装openpose的,之后按照网上的流程来,可是不管怎么安装依赖项以及修改make.config都卡在最后了[ 4%] Building CXX object src/caffe/CMakeFiles/caffe.dir/util/blocking_queue.cpp.o[ 5%] Linking CXX shared library ../../lib/lib_//usr/lib/x86_64-linux-gnu/libtbb.so.2:对‘__cxa_init_primary_exception@cxxa

会议室电脑怎么无线投屏_会议室无线投屏-程序员宅基地

文章浏览阅读1k次。会议室电脑怎么无线投屏?尤其是远程会议电脑如何无线投屏,可能觉得市场上多如牛毛的投屏器就可以解决这个问题。事实上,投屏器真的可以做到无线投屏电脑吗?一些企业需要召开远程会议,这样可以节省会议成本。演示的会议内容需要多地同屏,比如政府部门,银行等分支机构较多的单位,投屏器是否有这么庞大的数据传输能力;应用开发团队,需要轮流切换不同的电脑和连接设备,接口和分辨率等兼容问题,要反复调试严重影响会议进度;做产品设计演示时让团队成员可以更直观地看到设计稿。这些小问题是企业协同办公中不可忽视的痛点,部署连通宝多屏互_会议室无线投屏