SpringCloud-数据认证加密总结

news2024/11/15 18:56:32

一、数据加密认证介绍

在当今分布式系统的日益复杂和信息传递的广泛网络化环境中,确保通信的安全性至关重要。数据的加密和认证作为保障信息传递安全的关键手段,在分布式系统中扮演着不可或缺的角色。Spring Cloud,作为一套构建微服务架构的强大框架,提供了多种灵活而强大的数据加密和认证方式。从传统的 MD5 散列算法到现代的 OAuth 2.0 和 JWT(JSON Web Token)标准,每种加密和认证方式都针对不同的应用场景和安全需求提供了特定的解决方案。


二、常见加密算法

1、MD5加密

MD5(Message Digest Algorithm 5)是一种常用的哈希函数,广泛用于对敏感信息的加密。MD5 是一种不可逆的加密方式,生成的摘要长度为 128 位。

 MD5 的认证流程示意图:

MD5的Spring Cloud代码示例:

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Example {

    public static String encrypt(String data) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(data.getBytes());
            BigInteger no = new BigInteger(1, messageDigest);
            String hashText = no.toString(16);
            while (hashText.length() < 32) {
                hashText = "0" + hashText;
            }
            return hashText;
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5 encryption failed", e);
        }
    }

    public static void main(String[] args) {
        String originalData = "Hello, Spring Cloud!";
        String encryptedData = encrypt(originalData);
        System.out.println("Original Data: " + originalData);
        System.out.println("MD5 Encrypted Data: " + encryptedData);
    }
}

2、ASE对称加密

AES(Advanced Encryption Standard)是一种对称加密算法,被广泛用于保护敏感数据的安全性。对称加密使用相同的密钥进行加密和解密,因此密钥的安全性至关重要。

AES的认证流程示意图:

AES的Spring Cloud代码示例:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class AESEncryptionExample {

    public static String encrypt(String data) {
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128);
            SecretKey secretKey = keyGenerator.generateKey();

            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);

            byte[] encryptedData = cipher.doFinal(data.getBytes());
            return Base64.getEncoder().encodeToString(encryptedData);
        } catch (Exception e) {
            throw new RuntimeException("AES encryption failed", e);
        }
    }

    public static String decrypt(String encryptedData) {
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128);
            SecretKey secretKey = keyGenerator.generateKey();

            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);

            byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
            return new String(decryptedData);
        } catch (Exception e) {
            throw new RuntimeException("AES decryption failed", e);
        }
    }

    public static void main(String[] args) {
        String originalData = "Hello, Spring Cloud!";
        String encryptedData = encrypt(originalData);
        String decryptedData = decrypt(encryptedData);

        System.out.println("Original Data: " + originalData);
        System.out.println("AES Encrypted Data: " + encryptedData);
        System.out.println("AES Decrypted Data: " + decryptedData);
    }
}

3、RSA非对称加密

RSA 是一种非对称加密算法,广泛用于数据传输中的加密和签名。RSA 使用一对公私钥进行加密和解密,保证了数据的安全性和完整性。

RSA的认证流程示意图:

RSA的Spring Cloud代码示例:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.util.Base64;

public class RSAEncryptionExample {

    public static String encrypt(String data, PublicKey publicKey) {
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] encryptedData = cipher.doFinal(data.getBytes());
            return Base64.getEncoder().encodeToString(encryptedData);
        } catch (Exception e) {
            throw new RuntimeException("RSA encryption failed", e);
        }
    }

    public static String decrypt(String encryptedData, PrivateKey privateKey) {
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
            return new String(decryptedData);
        } catch (Exception e) {
            throw new RuntimeException("RSA decryption failed", e);
        }
    }

    public static KeyPair generateKeyPair() {
        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(2048); // Key size
            return keyPairGenerator.generateKeyPair();
        } catch (Exception e) {
            throw new RuntimeException("RSA key pair generation failed", e);
        }
    }

    public static String sign(String data, PrivateKey privateKey) {
        try {
            Signature signature = Signature.getInstance("SHA256withRSA");
            signature.initSign(privateKey);
            signature.update(data.getBytes());
            byte[] signatureBytes = signature.sign();
            return Base64.getEncoder().encodeToString(signatureBytes);
        } catch (Exception e) {
            throw new RuntimeException("RSA signing failed", e);
        }
    }

    public static boolean verify(String data, String signature, PublicKey publicKey) {
        try {
            Signature verifier = Signature.getInstance("SHA256withRSA");
            verifier.initVerify(publicKey);
            verifier.update(data.getBytes());
            return verifier.verify(Base64.getDecoder().decode(signature));
        } catch (Exception e) {
            throw new RuntimeException("RSA signature verification failed", e);
        }
    }

    public static void main(String[] args) {
        String originalData = "Hello, Spring Cloud!";
        KeyPair keyPair = generateKeyPair();
        String encryptedData = encrypt(originalData, keyPair.getPublic());
        String decryptedData = decrypt(encryptedData, keyPair.getPrivate());

        System.out.println("Original Data: " + originalData);
        System.out.println("RSA Encrypted Data: " + encryptedData);
        System.out.println("RSA Decrypted Data: " + decryptedData);

        String signature = sign(originalData, keyPair.getPrivate());
        boolean isVerified = verify(originalData, signature, keyPair.getPublic());

        System.out.println("Signature: " + signature);
        System.out.println("Signature Verification: " + isVerified);
    }
}

4、OAuth2.0加密

OAuth 2.0 是一种授权框架,用于授予第三方应用有限的访问权限。在实际应用中,OAuth 2.0 通常与 JWT 一同使用,以提供令牌生成和验证的安全机制。

OAuth 2.0的认证流程示意图:

OAuth 2.0示例代码:

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            .withClient("client-id")
            .secret("client-secret")
            .authorizedGrantTypes("password", "authorization_code", "refresh_token")
            .scopes("read", "write")
            .accessTokenValiditySeconds(3600)
            .refreshTokenValiditySeconds(86400);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }
}

上述代码通过 Spring Security 的 @EnableAuthorizationServer 注解配置了一个简单的 OAuth 2.0 授权服务器,使用了基于密码授权和授权码授权的方式。

5、JWT加密

JWT(JSON Web Token)是一种轻量的、自包含的令牌,通常由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。在实际应用中,使用 Spring Security 和 jjwt 库可以很方便地实现 JWT 的生成和验证。

JWT的认证流程示意图:

JWT示例代码:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {

    private static final String SECRET_KEY = "your-secret-key";
    private static final long EXPIRATION_TIME = 864_000_000; // 10 days

    public static String generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }

    public static boolean validateToken(String token, UserDetails userDetails) {
        String username = extractUsername(token);
        return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
    }

    private static boolean isTokenExpired(String token) {
        Date expirationDate = extractExpirationDate(token);
        return expirationDate.before(new Date());
    }

    private static String extractUsername(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
    }

    private static Date extractExpirationDate(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration();
    }
}

上述代码中,generateToken 方法用于生成 JWT,validateToken 方法用于验证 JWT 的有效性。请注意替换 SECRET_KEY 为实际项目中使用的密钥。 


三、不同加密算法对比

以下是五种常见加密方式的对比:

加密方式特点优势不足
MD5单向散列算法,不可逆计算速度快,生成固定长度摘要易受碰撞攻击,不适合存储敏感信息
AES对称加密算法,加解密使用相同密钥高效,适用于大量数据加密密钥分发管理相对复杂
RSA非对称加密算法,公钥加密私钥解密安全性高,密钥分发相对简单计算量大,不适合大数据量加密
OAuth 2.0授权框架,用于授予第三方应用访问权限灵活,适用于多种场景需要实现额外的令牌管理机制
JWT轻量自包含令牌,可用于身份验证和信息传递简单,可扩展性好令牌无法撤销,信息存储在客户端

这个对比表简要概括了每种加密方式的特点、优势和不足。在选择加密方式时,需要根据具体的应用场景和安全需求综合考虑,以达到最合适的加密方案。


四、数据认证加密总结

数据认证和加密是保障微服务系统通信安全的重要手段。通过合理选择和使用 MD5、AES、RSA、OAuth 2.0 和 JWT 等加密算法,可以在不同的场景中实现安全的数据传输和认证。密钥管理、算法的合理选用、数据传输的完整性和安全性都是建立可信系统的关键要素。系统设计者应根据具体需求选择适当的加密方式,确保系统在通信中的数据安全性和完整性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode每日一题】1976. 到达目的地的方案数

文章目录 [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/)思路&#xff1a;代码&#xff1a; 1976. 到达目的地的方案数 思路&#xff1a; 利用 Dijkstra 算法计算最短路径&#xff0c;并同时记录最短路径的数量&#xf…

双指针的一些题目

题目1&#xff1a;统计子矩阵 4405. 统计子矩阵 - AcWing题库 解题 前缀和暴力枚举x1、y1、x2、y2的做法是O()的&#xff0c;考虑用双指针进行优化。 优化的方式是&#xff1a;我们将每一列在[x1,x2]范围内的部分看作一个整体&#xff0c;用指针维护左右边界。 当当前矩阵的…

直播预告|从一张 CD 说起,关于播放器的前世今生

1877 年&#xff0c;天才发明家爱迪生研发出了人类历史上第一台可以录音和放音的装置&#xff0c;被称为“话筒”。 当时&#xff0c;这台机器使用一张薄薄的铁箔盘来录制声音&#xff0c;爱迪生亲手转动铁箔盘&#xff0c;在上面刻下声音的波纹。不过这个设计并不太实用&…

python中的defaultdict

collections.defaultdict 是 collections 模块提供的一个有用的类&#xff0c;它是内置字典类 dict 的一个子类。与普通字典一样&#xff0c;可以进行元素的访问、添加、删除等操作。区别在于当访问一个不存在的键时&#xff0c;defaultdict 会返回默认值&#xff0c;而不会引发…

ArcGIS学习(十二)ModelBuilder参数化建模

ArcGIS学习(十二)ModelBuilder参数化建模 1.ModelBuilder应用基础 本任务给大家带来的是ArcGIS中一个非常有意思也很重要的模块一-ModelBuilder。ModelBuilder有什么用呢? 大家设想一下这些场景: 你在做一项复杂研究,使用到ArcGIS中的多个工具和步骤,包括缓冲区分析、空…

建立网络防御时需要重点考虑的10个因素

互联网安全中心&#xff08;CIS&#xff09;建议企业可以从以下10个因素入手&#xff1a;资产管理、数据管理、安全配置、账户和访问控制管理、漏洞管理、日志管理、恶意软件防御、数据恢复、安全培训和事件响应。 1、资产管理 建立网络防御的第一步是制定企业资产和软件资产的…

居间中介CRM系统:提升销售业绩,有效管理企业客户资源

居间中介CRM系统是一种用于提升销售业绩和有效管理企业客户资源的软件系统。它能够帮助居间中介机构跟踪和管理客户关系&#xff0c;提高销售团队的工作效率和组织能力。 鑫鹿居间中介CRM系统具备以下功能&#xff1a; 1. 客户管理 系统可以记录和维护客户的基本信息&#xf…

Nano 33 BLE Sense Rev2学习第一节——环境配置

参考文档见Access Barometric Pressure Sensor Data on Nano 33 BLE Sense | Arduino Documentation 打开Arduino ide安装开发板 选择开发板 连接开发板到电脑&#xff0c;自动识别开发板端口&#xff0c;选择端口

小华最多能得到多少克黄金 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 小华按照地图去寻宝&#xff0c;地图上被划分成 m 行和 n 列的方格横纵坐标范围分别是[ 0 ,n−1]和[ 0 , m−1]。 在横坐标和纵坐标数位之和不大于 k 的方格中存…

了解现货黄金的技术分析技巧

在金融市场&#xff0c;特别是现货黄金交易领域中&#xff0c;投资者和交易者都致力于寻找那些可以带来盈利的秘诀与策略。黄金作为一种避险资产&#xff0c;其价格受到众多因素的影响&#xff0c;包括全球经济状况、货币政策、市场需求等。因此&#xff0c;掌握现货黄金的技术…

如何分辨Mac设备X86或ARM

在终端中输入如下命令可以获取到当前 Mac 设备是 X86 还是 ARM 类型 uname -a 以上便是此次分享的全部内容&#xff0c;希望能对大家有所帮助!

ModuleNotFoundError:如何解决 no module named Python 错误?

1.问题描述 下面的python执行时&#xff1a; import chinese_calendar import datetime def is_holiday(year, month, day):return chinese_calendar.is_holiday(year, month, day) # 判断2023年2月14日是否为节假日 print(is_holiday(2023, 2, 14)) # 输出: False报错如下&a…

AI从截图直接生成代码、前端程序员的福音

简介 项目可以将任何屏幕截图或设计转换为干净的代码&#xff08;支持大多数框架&#xff09;。来自领先公司的开发人员和设计师使用的排名第一的工具。完全开源&#xff0c;在 GitHub 上拥有超过 35,000 颗星。非常受欢迎。 各位小伙伴们感觉有帮助的&#xff0c;可以收藏一…

Docker中使用nginx-rtmp推拉网络摄像头视频流

前言&#xff1a; 该部分比较麻烦&#xff0c;闹腾了好久&#xff08;ffmpeg推拉流没学过&#xff0c;事实证明依葫芦画瓢是不行滴&#xff0c;后面有时间再学吧&#xff09;&#xff0c;后来借助chatGPT勉强解决&#xff0c;但不是很懂。因个人能力有限&#xff0c;只复述操作…

前端部署真的不简单

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~> 原文&#xff1a;前端部署真的不简单 - 掘金 (juejin.cn) 现在大部分的中小型公司部署前端代码都是比较简单的&#xff0c;主要步骤如下: 首先&#xff0c;通过脚手架提供的命令npm run build打包前端代码&…

外汇天眼:蓝莓市场终止所有MT4/MT5专业公司业务

总部位于澳大利亚的零售外汇和差价合约经纪商蓝莓市场宣布&#xff0c;已终止其数据和平台服务产品&#xff0c;该产品旨在通过利用其基础设施为专业公司行业提供服务。 蓝莓市场表示&#xff0c;已经对其数据和平台服务产品“落下帷幕”&#xff0c;与所有专业交易公司包括MyF…

3分钟开通GPT-4

AI从前年12月份到现在已经伴随我们一年多了&#xff0c;还有很多小伙伴不会开通&#xff0c;其实开通很简单&#xff0c;环境需要自己搞定&#xff0c;升级的话就需要一张visa卡&#xff0c;办理visa卡就可以直接升级chatgptPLSU 一、虚拟卡支付 这种方式的优点是操作简单&…

html邮件基本使用方法?如何发送HTML邮件?

html邮件是什么意思&#xff1f;如何在HTML中创建电子邮件链接&#xff1f; HTML邮件以其丰富的格式和视觉效果&#xff0c;让我们的邮件内容更加生动和吸引人。那么&#xff0c;HTML邮件的基本使用方法是什么呢&#xff1f;我们又该如何发送HTML邮件呢&#xff1f;下面&#…

Linux之HTTP协议

目录 一、HTTP协议 1.1 HTTP概念 1.2 HTTP协议的格式 1.3 URL 1.4 HTTP的请求方法 1.5 HTTP的状态码 1.6 HTTP报头 1.7 长链接与短链接 1.8 Cookie与Session 1.8.1 Cookie的概念 1.8.2 Cookie的应用场景 1.8.3 Session的概念 一、HTTP协议 1.1 HTTP概念 HTTP&…

使用Javassist 在android运行时生成类

序言 最近在写框架&#xff0c;有一个需求就是动态的生成一个类&#xff0c;然后查阅了相关文献&#xff0c;发现在android中动态生成一个类还挺麻烦。因次把一些内容分享出来&#xff0c;帮助大家少走弯路。 方案一 DexMaker DexMaker 是一个针对 Android 平台的库&#xf…