亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringCloud中數據認證加密的方法總結

 更新時間:2024年03月07日 08:47:54   作者:Damon小智  
在當今分布式系統(tǒng)的日益復雜和信息傳遞的廣泛網絡化環(huán)境中,數據的加密和認證作為保障信息傳遞安全的關鍵手段,Spring?Cloud,作為一套構建微服務架構的強大框架,提供了多種靈活而強大的數據加密和認證方式,本文給大家總結了SpringCloud數據認證加密的方法

一、數據加密認證介紹

在當今分布式系統(tǒng)的日益復雜和信息傳遞的廣泛網絡化環(huán)境中,確保通信的安全性至關重要。數據的加密和認證作為保障信息傳遞安全的關鍵手段,在分布式系統(tǒng)中扮演著不可或缺的角色。Spring Cloud,作為一套構建微服務架構的強大框架,提供了多種靈活而強大的數據加密和認證方式。從傳統(tǒng)的 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、AES對稱加密

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 {
 
    private static SecretKey secretKey;
 
    public AESEncryptionExample() {
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128);
            secretKey = keyGenerator.generateKey();
        } catch (Exception e) {
            throw new RuntimeException("AES key generation failed", e);
        }
    }
 
    public static String encrypt(String data) {
        try {
            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 {
            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) {
        AESEncryptionExample aesEncryptionExample = new AESEncryptionExample();
 
        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 為實際項目中使用的密鑰。 

三、不同加密算法對比

以下是五種常見加密方式的對比:

加密方式特點優(yōu)勢不足
MD5單向散列算法,不可逆計算速度快,生成固定長度摘要易受碰撞攻擊,不適合存儲敏感信息
AES對稱加密算法,加解密使用相同密鑰高效,適用于大量數據加密密鑰分發(fā)管理相對復雜
RSA非對稱加密算法,公鑰加密私鑰解密安全性高,密鑰分發(fā)相對簡單計算量大,不適合大數據量加密
OAuth 2.0授權框架,用于授予第三方應用訪問權限靈活,適用于多種場景需要實現額外的令牌管理機制
JWT輕量自包含令牌,可用于身份驗證和信息傳遞簡單,可擴展性好令牌無法撤銷,信息存儲在客戶端

這個對比表簡要概括了每種加密方式的特點、優(yōu)勢和不足。在選擇加密方式時,需要根據具體的應用場景和安全需求綜合考慮,以達到最合適的加密方案。

四、數據認證加密總結

數據認證和加密是保障微服務系統(tǒng)通信安全的重要手段。通過合理選擇和使用 MD5、AES、RSA、OAuth 2.0 和 JWT 等加密算法,可以在不同的場景中實現安全的數據傳輸和認證。密鑰管理、算法的合理選用、數據傳輸的完整性和安全性都是建立可信系統(tǒng)的關鍵要素。系統(tǒng)設計者應根據具體需求選擇適當的加密方式,確保系統(tǒng)在通信中的數據安全性和完整性。

以上就是SpringCloud數據認證加密的方法總結的詳細內容,更多關于SpringCloud數據認證加密的資料請關注腳本之家其它相關文章!

相關文章

  • Java利用多線程復制文件

    Java利用多線程復制文件

    這篇文章主要介紹了Java利用多線程復制文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Java實現調用jython執(zhí)行python文件的方法

    Java實現調用jython執(zhí)行python文件的方法

    這篇文章主要介紹了Java實現調用jython執(zhí)行python文件的方法,結合實例形式分析了Java調用jython執(zhí)行python文件的常見操作技巧及相關問題解決方法,需要的朋友可以參考下
    2018-03-03
  • Java中使用HashMap改進查找性能的步驟

    Java中使用HashMap改進查找性能的步驟

    這篇文章主要介紹了Java中使用HashMap改進查找性能的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • MyBatisPlus之id生成策略的方法

    MyBatisPlus之id生成策略的方法

    本文主要介紹了MyBatisPlus之id生成策略的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 使用springboot打包后的文件讀取方式

    使用springboot打包后的文件讀取方式

    這篇文章主要介紹了使用springboot打包后的文件讀取方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 通過實例學習Spring @Required注釋原理

    通過實例學習Spring @Required注釋原理

    這篇文章主要介紹了通過實例學習Spring @Required注釋原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Spring?Cache?集成?Caffeine實現項目緩存的示例

    Spring?Cache?集成?Caffeine實現項目緩存的示例

    本文主要介紹了Spring?Cache?集成?Caffeine實現項目緩存的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • java?-jar命令及SpringBoot通過java?-jav啟動項目的過程

    java?-jar命令及SpringBoot通過java?-jav啟動項目的過程

    本篇文章將為大家講述關于 SpringBoot 項目工程完成后,是如何通過 java-jar 命令來啟動的,以及介紹 java-jar 命令的詳細內容,對SpringBoot java?-jav啟動過程感興趣的朋友跟隨小編一起看看吧
    2023-05-05
  • java多線程編程之Synchronized關鍵字詳解

    java多線程編程之Synchronized關鍵字詳解

    這篇文章主要為大家詳細介紹了java多線程編程之Synchronized關鍵字,感興趣的朋友可以參考一下
    2016-05-05
  • Java?Stream比較兩個List的差異并取出不同的對象四種方法

    Java?Stream比較兩個List的差異并取出不同的對象四種方法

    今天開發(fā)一個需求時要對A和B兩個List集合遍歷,并比較出集合A有,而集合B沒有的值,下面這篇文章主要給大家介紹了關于Java?Stream比較兩個List的差異并取出不同對象的四種方法,需要的朋友可以參考下
    2024-01-01

最新評論