`
雷诺阿
  • 浏览: 17569 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用AES+Base64加密方式加密、解密以及异常的解决

    博客分类:
  • java
阅读更多

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

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


/**
 * @author
 * 加密/解密 公共类
 */
@SuppressWarnings("restriction")
public class DESUtils 

    private static Key key; 
    private static String KEY_STR="mykey"; 
   
    static{ 

// 在之前的linux服务器上这样使用没有问题,但同事往新的linux服务器上部署时出现以下异常:

// java.lang.RuntimeException: javax.crypto.BadPaddingException: Invalid pad value!

// 原因分析:

 

/* SecureRandom 实现完全随操作系统本身的內部状态,除非调用方在调用 getInstance 方法之后又调用 了 setSeed 方法;该实现在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux 系统上则不同。
*/

//        try 
//        { 
//            KeyGenerator generator = KeyGenerator.getInstance("DES"); 
//            SecureRandom secureRandom=SecureRandom.getInstance("SHA1PRNG"); 
//            secureRandom.setSeed(KEY_STR.getBytes()); 
//            generator.init(secureRandom); 
//            key = generator.generateKey(); 
//            generator=null; 
//        } 
//        catch (Exception e) 
//        { 
//            throw new RuntimeException(e); 
//        }

 

// 改成这样后,就解决了!
        try {
            KeyGenerator generator=KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(KEY_STR.getBytes());
            generator.init(128,secureRandom);
            key = generator.generateKey();
            generator=null;
          }  catch (Exception e) {
              throw new RuntimeException("初始化密钥出现异常");
          }
       
    } 
     
    /**
     * 对字符串进行加密,返回BASE64的加密字符串
     * <功能详细描述>
     * @param str
     * @return
     * @see [类、类#方法、类#成员]
     */ 
    public static String getEncryptString(String str){ 
        BASE64Encoder base64Encoder = new BASE64Encoder(); 
        System.out.println(key); 
        try 
        { 
            byte[] strBytes = str.getBytes("UTF-8"); 
            Cipher cipher = Cipher.getInstance("AES"); 
            cipher.init(Cipher.ENCRYPT_MODE, key); 
            byte[] encryptStrBytes = cipher.doFinal(strBytes); 
            return base64Encoder.encode(encryptStrBytes); 
        } 
        catch (Exception e) 
        { 
            throw new RuntimeException(e); 
        } 
         
    } 
     
    /**
     * 对BASE64加密字符串进行解密
     * <功能详细描述>
     * @param str
     * @return
     * @see [类、类#方法、类#成员]
     */ 
    public static String getDecryptString(String str){ 
        BASE64Decoder base64Decoder = new BASE64Decoder(); 
        try 
        { 
            byte[] strBytes = base64Decoder.decodeBuffer(str); 
            Cipher cipher = Cipher.getInstance("AES"); 
            cipher.init(Cipher.DECRYPT_MODE, key); 
            byte[] encryptStrBytes = cipher.doFinal(strBytes); 
            return new String(encryptStrBytes,"UTF-8"); 
        } 
        catch (Exception e) 
        { 
            throw new RuntimeException(e); 
        } 
         
    } 
     
    //main测试
//    public static void main(String[] args) 
//    { 
//        String name ="admin"; 
//        String password="123456"; 

//        String encryname = getEncryptString(name); 
//        String encrypassword = getEncryptString(password); 
//        System.out.println("用户名加密后:"+encryname); 
//        System.out.println("密码加密后:"+encrypassword); 
//         
//        System.out.println("用户名解密后:"+getDecryptString(encryname)); 
//        System.out.println("密码解密后:"+getDecryptString(encrypassword)); 
//    } 
}

 

===================================================================================

 

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

/**
 * @author
 * 扩展PropertyPlaceholderConfigurer将prop文件中加密后的属性解密后递交给Spring
 */
public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer 

    //encryptPropNames存储需要解密的属性
    private String[] encryptPropNames = {"jdbc.username", "jdbc.password"}; 
     
    /*
     *重写convertProperty,对已有加密特征的属性进行解密
     */
    @Override 
    protected String convertProperty(String propertyName, String propertyValue) 
    { 
         
        //如果在加密属性名单中发现该属性 
        if (isEncryptProp(propertyName)) 
        { 
            String decryptValue = DESUtils.getDecryptString(propertyValue); 
            return decryptValue; 
        }else {
            return propertyValue; 
        } 
         
    } 
     
    /**
     * 判断属性值是否加密
     * @param propertyName
     * @return
     */
    private boolean isEncryptProp(String propertyName) 
    { 
        for (String encryptName : encryptPropNames) 
        { 
            if (encryptName.equals(propertyName)) 
            { 
                return true; 
            } 
        } 
        return false; 
    } 
}

 

 

===================================================================================

在spring.xml文件中增加如下配置:

<bean id="propertyConfig"    class="com.gdt.smart.modules.slms.util.EncryptPropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
 </bean>

分享到:
评论

相关推荐

    AES+BASE64加密算法

    文件"AESCoder"可能是一个实现AES+BASE64加密解密功能的代码库或者工具。在使用这样的工具时,开发者需要导入相关库,设置好密钥,并调用相应的函数进行加密和解密操作。在Python中,可以使用`cryptography`库来实现...

    微信小程序 AES ECB base64 加密解密

    在IT行业中,加密技术是确保数据安全的重要手段。...总的来说,理解并正确使用AES ECB Base64加密解密是微信小程序开发中保障数据安全的关键。通过合理的加密策略和安全实践,可以有效防止数据泄露,保护用户隐私。

    AES加密解密 Base64加密解密

    java代码实例 AES加密解密 Base64加密解密

    PB BASE64加密和解密DEMO

    PB BASE64加密和解密DEMO是一种在PowerBuilder(PB)环境中实现的基于BASE64编码技术的加密和解密方法。BASE64是一种常见的数据编码方式,它将二进制数据转换为可打印的ASCII字符,常用于在网络上传输包含二进制的...

    工具类JAVA (Android Studio )+ JS 加密解密 AES + Base 64

    工具类JAVA (Android Studio )+ JS 加密解密 AES + Base 64

    3DES+Base64加密解密算法

    开发者需要自己编写代码来实现密钥的生成、数据的分组以及3DES的加密解密过程,并结合Base64编码解码函数。 需要注意的是,虽然3DES在安全性方面比单一的DES强,但在现代密码学中,其仍被认为是较弱的加密方案,...

    AES加密base64编码

    在iOS平台上,我们可以使用`CommonCrypto`库或者Swift的`CryptoKit`框架来实现AES加密,然后使用内置的`Data`类的`base64Encoded`方法进行Base64编码。 **应用场景** 这种组合方式常用于敏感信息的存储和传输,...

    java aes加密转换Base64 使用 CBC 解密模式

    java AES加密解密,使用 CBC 解密模式,EncryptByAes Aes加密 后 base64 再加 DecryptByAes Aes 解密,对 PKCS7 填充的数据进行反填充,对数据进行 PKCS7 填充 使用 CBC 解密模式, // aesDecrypt 解密 public ...

    VB6.0 RSA/AES/Md5/Base64加密 解密 微信小程序 javascript 通用

    综合来看,这个项目提供了一个跨平台的加密解密解决方案,适用于VB6.0开发的桌面应用程序以及基于JavaScript的微信小程序。通过VB6.0编写的程序可能包含了实现这些加密解密算法的函数库,而VB_RSA_FRAME4.5以下.exe...

    采用JS端来对字符串进行MD5,AES,Base64等加密解密

    总结,通过JavaScript进行MD5、AES和Base64的加密解密是确保Web应用数据安全的重要手段。MD5用于数据校验,AES提供强加密,而Base64则方便在网络中传输二进制数据。了解并熟练运用这些加密方法,有助于开发更安全、...

    AES加密 BASE64测试代码

    压缩包内的源代码文件如aes.c、AES128Base64.c、base64.c和test.c分别代表了AES核心算法、AES128与Base64结合的实现、Base64编码和解码的实现以及测试代码。头文件aes.h、AES128Base64.h、base64.h则包含这些功能的...

    微信小程序base64 Aes加解密

    本文将详细介绍如何在微信小程序中使用Base64和AES加密技术来增强数据安全性。 一、Base64编码 Base64是一种用于在网络上传输二进制数据的编码方式。它将每3个字节的数据转换为4个字符的文本字符串。在微信小程序中...

    java实现SHA1、SHA、MD5、AES加密、AES解密、BASE64解密、BASE64加密,以及BASE64 jar和源码

    在这个压缩包中,包含的资源可以帮助我们理解并实现SHA1、SHA、MD5、AES加密与解密,以及BASE64编码和解码。下面我们将详细探讨这些加密算法和它们在Java中的实现。 1. **SHA(Secure Hash Algorithm)**: SHA是一...

    微信小程序base64加密,AES加密

    使用这样的工具集,开发者可以更专注于业务逻辑,而不必关心底层加密解密的具体实现。 总的来说,微信小程序中的Base64和AES加密是保障用户数据安全的重要手段。理解并熟练运用这两种技术,对于开发安全可靠的微信...

    AES-128-CBC加密Base64编码Demo

    在这个Demo中,我们主要探讨的是如何使用AES-128-CBC进行数据加密,并通过Base64编码来将加密后的结果转化为可读字符串。 AES-128-CBC的特点在于它使用128位的密钥,这提供了非常高的安全性。在CBC模式下,每个明文...

    Sql Server Base64加密解密角本

    非常实用的Base64加密,解密角本。基于UTF8,支持中文加解密。

    Base64转码,AES加密解密,IOS,Android,Java

    Base64转码,AES加密解密,IOS,Android,Java 后台。 本工程可以直接使用,而且与IOS,Android,JAVA 已调通。 主要用于客户端进行通信,数据之间地安全性。对数据进行加密和解密。 适用于银行等较为保密的项目中。 ...

    Base64 个性化加密解密功能VB源码

    至于“个性化加密解密功能”,这可能指的是在Base64的基础上增加额外的加密层,如使用AES、RSA等加密算法。在VB中,可以使用.NET Framework提供的`System.Security.Cryptography`命名空间下的类来实现。例如,如果...

    AES/Base64加密

    AES(Advanced Encryption Standard)和Base64是两种常见的加密和编码方式,常被用于保护敏感信息,如用户密码、隐私数据等。 AES,全称为高级加密标准,是一种块密码,它基于替换和置换的原理,采用对称加密方式,...

    SqlServerBase64 加密解密.rar

    本文将详细介绍如何在SQL Server中使用Base64进行加密和解密操作,特别关注如何处理包含中文、数字和字母的数据。 1. **Base64编码原理** Base64是一种基于64个可打印字符来表示二进制数据的编码方式。这64个字符...

Global site tag (gtag.js) - Google Analytics