对称加密+非对称加密,实现数据安全传输

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

一般金融类的产品,涉及前端和后端交互的时候,都会都严格的数据安全保证。防止黑客攻击,信息篡改。

加密方式有很多,总的来说,分为2种:对称和非对称。我们先来看一下,这两种加密方式分别是什么?他们有什么区别?

对称加密:

对称加密,即采用对称的密码编码技术,他的特点是,加密和解密使用相同的秘钥。

 

常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES。对称加密算法使用起来简单快捷,密钥较短,且破译困难。

但是对称秘钥在使用过程中存在以下问题:

1、对称加密算法一般不能提供信息完整性的鉴别。它无法验证发送者和接受者的身份;

2、对称密钥的管理和分发工作是一件具有潜在危险的和烦琐的过程。如何防止秘钥泄露是一个难点。

非对称加密:

非对称加密技术,需要两个秘钥,公钥和私钥。公钥和私钥成对出现。

 

如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。

非对称加密的典型应用是数字签名。

常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。

对称+非对称:

现在,我们已经对对称和非对称加密有了一定的了解。接下来,我将会给大家介绍一下,我在项目中使用的一种加密方式:对称+非对称。

先看一张流程图:

先看发送方:

这里,我们主要有2步操作。

1、报文原文使用对称加密技术。对称加密的秘钥(避免混淆,这里称对称密码)。根据随机数生成。每次发起请求时,会重新产生一个随机数,进一步降低被破解的风险。      

2、对称密码通过非对称加密方式进行加密。公钥由后台产生,匹配的私钥由后台保管。这样产生一个加密后的对称密码。前端在发送给后端之后,后端需要用匹配的私钥才能解开。

再看接收方:

接收方在接收到数据包之后,同样有两步操作:

1、会使用匹配的私钥解密加密的对称密码,获取到真实的对称密码。

2、使用对称密码,解密加密报文,获取原报文内容。

 

这样做的好处是:

1、因为我们的对称密码是使用非对称加密的,因此,想要破解,需要找到相应的公钥才行。

2、每次请求会重新生成一个对称密码,这就加大了破解的难度。

 

代码实现:

工具类:

非对称加密:

public class RSA1 {
    /**
     * 随机生成公钥和私钥
     */

    public static final String publicKeyString  = "publicKeyString";
    public static final String privateKeyString = "privateKeyString";


    public static HashMap<String, String> getRandomKey() throws NoSuchAlgorithmException, InvalidKeySpecException {
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        keyPairGen.initialize(1024);//生成大小 1024
        KeyPair keyPair = keyPairGen.generateKeyPair();
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//获取公钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//获取私钥
        HashMap<String, String> keyMap = new HashMap<String, String>();
        keyMap.put(publicKeyString, new String(Base64.encode(publicKey.getEncoded(), Base64.DEFAULT)));//获取公钥Base64编码
        keyMap.put(privateKeyString, new String(Base64.encode(privateKey.getEncoded(), Base64.DEFAULT)));//获取密钥Base64编码
        return keyMap;
    }

    /**
     * 通过字符串生成私钥
     */
    public static PrivateKey getPrivateKey(String privateKeyData) {
        PrivateKey privateKey = null;
        try {
            byte[] decodeKey = Base64.decode(privateKeyData, Base64.DEFAULT); //将字符串Base64解码
            PKCS8EncodedKeySpec x509 = new PKCS8EncodedKeySpec(decodeKey);//创建x509证书封装类
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");//指定RSA
            privateKey = keyFactory.generatePrivate(x509);//生成私钥
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return privateKey;
    }


    /**
     * 通过字符串生成公钥
     */
    public static PublicKey getPublicKey(String publicKeyData) {
        PublicKey publicKey = null;
        try {
            byte[] decodeKey = Base64.decode(publicKeyData, Base64.DEFAULT);
            X509EncodedKeySpec x509 = new X509EncodedKeySpec(decodeKey);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            publicKey = keyFactory.generatePublic(x509);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return publicKey;
    }

    /**
     * 加密
     */
    public static byte[] encrypt(String data, Key key) {
        try {
            //取公钥
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm(),"BC");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            return cipher.doFinal(data.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 解密
     */
    public static byte[] decrypt(byte[] data, Key key) {
        try {
            Cipher cipher = Cipher.getInstance("RSA","BC");
            cipher.init(Cipher.DECRYPT_MODE, key);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

对称加密:

public class AES_2 {

    public static byte[] genPrivateKey(String password) throws NoSuchAlgorithmException {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        byte[] bytes = tohash256Deal(password);
        SecureRandom securerandom = new SecureRandom(bytes);
        kgen.init(128, securerandom);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        return key.getEncoded();
    }

    public static byte[] encrypt(String content, SecretKeySpec key) {
        try {
            //创建一个实现指定转换的 Cipher对象,该转换由指定的提供程序提供。
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] byteContent = content.getBytes("utf-8");
            byte[] cryptograph = cipher.doFinal(byteContent);
            return Base64.encode(cryptograph, Base64.DEFAULT);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String decrypt(byte[] cryptograph, SecretKeySpec key) {
        try {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] content = cipher.doFinal(Base64.decode(cryptograph, Base64.DEFAULT));
            return new String(content);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static byte[] encrypt(String content, String password) {
        try {
            //"AES":请求的密钥算法的标准名称
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            //256:密钥生成参数;securerandom:密钥生成器的随机源
            SecureRandom securerandom = new SecureRandom(tohash256Deal(password));
            kgen.init(128, securerandom);
            //生成秘密(对称)密钥
            SecretKey secretKey = kgen.generateKey();
            //返回基本编码格式的密钥
            byte[] enCodeFormat = secretKey.getEncoded();
            //根据给定的字节数组构造一个密钥。enCodeFormat:密钥内容;"AES":与给定的密钥内容相关联的密钥算法的名称
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            //将提供程序添加到下一个可用位置
            Security.addProvider(new BouncyCastleProvider());
            //创建一个实现指定转换的 Cipher对象,该转换由指定的提供程序提供。
            //"AES/ECB/PKCS7Padding":转换的名称;"BC":提供程序的名称
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] byteContent = content.getBytes("utf-8");
            byte[] cryptograph = cipher.doFinal(byteContent);
            return Base64.encode(cryptograph, Base64.DEFAULT);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String decrypt(byte[] cryptograph, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom securerandom = new SecureRandom(tohash256Deal(password));
            kgen.init(128, securerandom);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Security.addProvider(new BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] content = cipher.doFinal(Base64.decode(cryptograph, Base64.DEFAULT));
            return new String(content);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    public static byte[] tohash256Deal(String datastr) {
        try {
            MessageDigest digester = MessageDigest.getInstance("SHA-256");
            digester.update(datastr.getBytes());
            byte[] hex = digester.digest();
            return hex;
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

}  

发送方和接收方的实现:

        String content = "000";
        JSONObject jsonObject = new JSONObject();
        try {
            LogT.i("++++++++++++++++++++++发送方+++++++++++++++++++++++++=");
            //产生私钥
            int random = (int) ((Math.random() * 9 + 1) * 100000);
            //私钥字节
            byte[] bytes = AES_2.genPrivateKey(String.valueOf(random));
            //传输报文加密
            SecretKeySpec key1 = new SecretKeySpec(bytes, "AES");
            byte[] content_encrypt = AES_2.encrypt(content, key1);
            //公钥对私钥加密
            PublicKey publicKey = RSA1.getPublicKey(public_key);
            sKey_encrypt = RSA1.encrypt(Base64.encodeToString(bytes, Base64.DEFAULT), publicKey);
            //数据组装
            jsonObject.put("key", Base64.encodeToString(sKey_encrypt, Base64.DEFAULT));
            jsonObject.put("content", AES_2.parseByte2HexStr(content_encrypt));

            LogT.i("+++++++++++++++++++++++接收方++++++++++++++++++++++++=");

            //解析获取私钥
            PrivateKey privateKey = RSA1.getPrivateKey(private_key);
            //解析接收到的key数据
            byte[] decode = Base64.decode(Base64.encodeToString(sKey_encrypt, Base64.DEFAULT), Base64.DEFAULT);
            //私钥解密
            byte[] decrypt = RSA1.decrypt(decode, privateKey);
            //解码私钥字节
            byte[] decode_orig = Base64.decode(new String(decrypt), Base64.DEFAULT);
            //加密的报文
            byte[] HexStrByte = AES_2.parseHexStr2Byte(AES_2.parseByte2HexStr(content_encrypt));
            SecretKeySpec key2 = new SecretKeySpec(decode_orig, "AES");
            //解密后的报文
            String decrypt1 = AES_2.decrypt(HexStrByte, key2);
            LogT.i(decrypt1);//000
        } catch (Exception e) {
            e.printStackTrace();
        }

 

                                                                                扫码关注,共同进步

 

 

对称加密非对称加密、混合加密、身份认证、数字签名、数字证书 而随着我们的信息安全发展,将上面所述的验证信息通过一种摘要的形式实现了。也就是在通信过程中,将数据通过Hash算法提取出一段定长的摘要。不可逆性:只有算法,没有密钥,只能加密,不能解密。所以摘要的比对只有拿到信息后用同一种摘要算法重新生成摘要,然后信息携带的摘要进行比对,两个摘要一致则数据具有完整性,反之则被篡改过,破坏了完整性。难题友好性:摘要是很难破解的,只有暴力枚举。也就是说你只有穷举所有字符串产生的摘要与要破解的摘要进行比对,相等了则被破解,反之,则继续穷举。 阅读详情

相关推荐

加密原理详解:对称式加密 VS 非对称式加密

一、前言 在了解加密原理前,我们来看看这样一个故事。 小红小明是情侣,一天,小红给小明发短信说:“亲爱的,我银行卡上没有钱了,你给我转1万块吧。”有过上当受骗经历的人都知道这有可能是小偷偷了小红手提包,然后拿手机发的短信。不过我们小明学过加密原理,于是他回复说:“你直接拿我的银行卡刷吧,密码加上我们第一次约会的日期就是663156。”很明显,只有小明小红知道他们第一次约会是什么时候,假设是2008年4月1号,那么小红就可以根据计算663156-200841=462315得到银行卡密码,就可以消费了。 这

vivo互联网技术 2177

对称加密非对称加密

既然要保证数据安全,就需要进行“加密”。网络传输中,不再直接传输明文了,而是加密之后的“密文”。加密的方式有很多,但整体上可以分成两大类:对称加密非对称加密

m0_65683419的博客 1万+

对称与非对称加密(DES&RSA)

是指使用同一个密钥进行信息的加密解密,加密解密的过程都使用相同的密钥,因此也称为共享密钥加密。这种加密方式的优点是速度快,适合加密大量的数据,但缺点是密钥需要在通信的双方之间共享。若密钥被泄漏,则整个加密系统的安全性就会被破解。是指使用一对密钥,即公钥私钥,进行信息的加解密。公钥可以任意发布,不需要保密,而私钥则必须严格保密。加密解密的过程使用不同的密钥,因此也称为公开密钥加密。这种加密方式的优点是密钥不需要在通信的双方之间共享,安全性较高,但缺点是加解密速度较慢,适合加密少量的数据。

故事讲予风听 6193

对称加密非对称加密,一文讲解明白!

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

askf01的博客 1万+

Java中的数据加密与安全传输实现

Java中的数据加密与安全传输实现 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 数据加密与安全传输的重要性 在当今信息时代,数据的安全性隐私保护是任何软件系统必须重视的核心问题。特别是在Java应用程序中,如何有效地实现数据加密安全传输,成为了开发...

cnzzs的博客 943

Api接口数据安全及数据加密方式主要流程实现

简述接口数据安全的主要实现方式 一:数据校验 常用算法:MD5,SHA1 流程: 1:前端生成数据后按照约定方式生成一个sign 校验字段(一般通过MD5或者SHA1 方式),一并提交给后端; 2:后端获得参数后通过同样的方式生成sign 然后跟接口携带的sign对比是否一致,以此判断数据是否被修改; eg:下面接口文档中的sign 接口参数有: 1 order_id:订单号,唯一,长度小于30 2 money:金额,分 3:type:支付类型 alipay(个码),alipay(支付宝),wecha

lqb3732842的博客 7万+

https原理-明文、对称加密非对称加密、CA

为了保证数据传输过程中的数据安全,目前都使用https协议。https全称:HyperText Transfer Protocol over Secure Socket Layer。其实https不是一个新的东西,我们可以理解为https=http+SSL/TLS。 SSL(Secure Socket Layer):安全套接字层协议 TLS(Transport Layer Security):传...

zhenjingcool的博客 287

Springboot+RSA非对称加密

这是百度百科对(对称加密非对称加密)的解释: (1)对称加密算法在加密解密时使用的是同一个秘钥。 (2)非对称加密算法需要两个密钥来进行加密解密,这两个秘钥是公开密钥(public key,简称公钥)私有密钥(private key,简称私钥)。 处理的思路: (1)服务端利用RSA创建一对公私钥,服务端存储私钥,将公钥给客户端 (2)每次请求前,将明文数据利用公钥进行加密,然后将密文传递给服务端 (3)服务端拿到密文,利用私钥进行解密,得到明文数据,然后进行业务处理 1.引入jarbao <

qq_35761348的博客 1715

iOS 数据安全、数据加密传输

iOS 数据安全、数据加密传输 近期接到一个新需求:APP企业版需要接入热更新功能。 热更新需要下发补丁脚本, 脚本下发过程中需要保证脚本传输安全,且需要避免中间人攻击。 需要用到数据加密传输方面的知识,以下是我设计的加密解密流程:   0. 将脚本 base64 编码,得到编码后的文本 encodedScript;   1. 将 encodedScript 使用...

u012109585的专栏 501

数据安全传输方案【待完成】

背景: 之前是做内部系统应用,对安全性的研究不够。对称加密非对称加密算法优劣没有研究。现在在互联网公司,需要开始考虑数据安全传输防http攻击的一些常见方案。本文主要记录关于数据安全传输的一些内容。 参考链接: 什么是安全传输: 为什么要安全传输: 怎么安全传输: 常见问题: ...

sev7nf的博客 452

Web前端对称及非对称加密传输|JSEncrypt|CryptoJS|jsrsasign

前端加解密 JSEncrypt 实现非对称加密 Github 地址:JSEncrypt 首先这个包 需要提前生成 公钥 私钥 依赖 openssl 注意: 明文长度最大为公钥长度 -11,假如我的公钥长度是 128,那明文最长也就 117 这个库是与 openssl 一起工作,首先生成公钥私钥 openssl genrsa -out rsa_1024_priv.pem 1024 openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.p

sb12306的博客 2476

应用层协议 -- HTTPS 协议

理解 HTTPS 协议概念、结构及其工作流程

想听风雨的博客 1357

Java中的数据加密与解密:使用JCE实现安全的数据存储与传输

Java Cryptography Extension(JCE)是Java平台中用于实现加密解密的关键组件,它提供了一组加密算法工具,可以帮助我们实现安全的数据存储与传输。通过使用Java Cryptography Extension(JCE),我们可以有效地实现数据的加密解密,确保数据在存储传输过程中的安全性。在存储数据时,通常需要加密数据,然后将加密后的数据存储在数据库或文件系统中。在解密过程中,我们将加密的文本从Base64解码,然后用相同的密钥IV进行解密,得到原始的明文数据。

技术研究中心 1222

大容量数据安全传输系统设计与实现(具体)

大容量数据安全传输系统设计与实现 一、需求 两个主体间实现远程大容量数据文件秘密传输(超过1G大小的容量) 1)设计并实现支持大容量数据秘密传输的系统; 2)该系统支持数据完整性来源验证; 开发坏境需求:windows平台,语言平台不限。 二、原理 (1)hash函数 hash函数是将任意长度的输入变换成固定长度输出的函数,该输出称为散列值。MD5是一种被广泛使用的hash函数,可以产生出一个1...

qq_40894815的博客 1154

java集成RSA非对称加密数据传输

前端请求后端接口时如:登录接口,这时候需要传账号密码到后端接口请求这样就会暴露请求的数据。RSA非对称加密分公钥私钥,公钥将数据进行加密,私钥对加密的数据进行解密 **(当然前端最好是封装一下不要暴露出来公钥)

yushun的博客 1043

RSA非对称加密(附工具类Util)

RSA非对称加密(附工具类Util)

Javaの甘乃迪的博客 4824

鸿蒙中的数据安全与加密技术

随着信息技术的发展,数据安全变得越来越重要。尤其是在智能设备物联网设备中,用户的隐私数据、金融信息、通信内容等都可能成为攻击者的目标。因此,数据加密技术被广泛应用于保护数据的保密性、完整性防止未经授权的访问。在鸿蒙(HarmonyOS)中,数据加密是确保数据安全的重要手段。对称加密非对称加密对称加密(如AES):加密解密使用相同的密钥。对称加密算法速度较快,但密钥的安全性管理是关键。非对称加密(如RSA):使用一对公钥私钥来进行加密解密。非对称加密适合用于密钥交换身份验证。

2201_75863687的博客 1017

【python】【加密解密功能函数】对称加密(AES)、非对称加密(RSA)、哈希算法(SHA-256)

本文介绍了如何实现常见的加密解密功能,包括 AES 加密解密、RSA 加密解密、SHA-256 哈希以及 Base64 编码解码。这些功能可以帮助开发者实现数据的安全加密、完整性校验格式转换,确保数据传输与存储过程中的安全性。希望这些工具能够为你的项目带来帮助。

qq_59344127的博客 1588

面试官:你了解数据安全传输吗?

鄢栋,微医云服务团队前端工程师。有志成为一名全栈开发工程师甚至架构师,路漫漫,吾求索。生活中通过健身释放压力,思考问题。看到这个标题,很多老铁会斩钉截铁的说,这道题我会!就是用 HTTP...

前端下午茶 1314
上一篇: 前端JS调用Android相机相册问题解决
下一篇: 拒绝第三方--手把手教你自定义进度条
Aminy123
博客等级 码龄10年 13粉丝 26原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值