`
jiangshaolin
  • 浏览: 57269 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

关于Base64工具类并发问题

    博客分类:
  • java
阅读更多
为减少对象创建次数,一般会做如下编码:

package com.***.frame.util;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Util {
	private static final BASE64Decoder decoder = new BASE64Decoder();
	private static final BASE64Encoder encoder = new BASE64Encoder();
	/**
	 * BASE64解密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String decryptBASE64(String key) throws Exception {
		if(key==null||key.length()<1){
			return "";
		}
		return new String(decoder.decodeBuffer(key));
	}

	/**
	 * BASE64加密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String encryptBASE64(String key) throws Exception {
		if(key==null||key.length()<1){
			return "";
		}
		return new String(encoder.encodeBuffer(key.getBytes()));
	}
}



此类看似没问题,在高并发下,存在解密失败的情况,无法还原出正确的原字符串。正确的做法如下:

	/**
	 * BASE64解密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String decryptBASE64(String key) throws Exception {
		if(key==null||key.length()<1){
			return "";
		}
		return new String(new BASE64Decoder().decodeBuffer(key));
	}

	/**
	 * BASE64加密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String encryptBASE64(String key) throws Exception {
		if(key==null||key.length()<1){
			return "";
		}
		return new String(new BASE64Encoder().encodeBuffer(key.getBytes()));
	}



具体细节待查。
分享到:
评论
12 楼 asme2u 2010-12-12  
楼主不知道有个东西叫ThreadLocal?
11 楼 小龟爬爬 2010-12-11  
用的 apache 的 commons-codec jar包,有这个问题吗?
10 楼 calvinlyc 2010-12-11  
frankiegao123 写道
创建一个对象并没有想象中的那么消耗系统资源,如果对于类库的线程安全性不了解的话,不建议弄成这种私有静态字段的。

另外,sun 及 com.sun 开头的包都是 JRE 类库,不同的 Java 实现厂商的 JRE 是不一样的,sun 的官网上也指出不要在应用程序中使用 sun 或 com.sun 开头包中的类。

用 Apache Commons Codec 中的类库吧。


对的,我上次在Maven build的时候看到warning message写着sun的Base64也许在下一个版本就被删除了,建议更改,网上好像比较支持使用apache codec代替sun那个作为加密和解密
9 楼 frankiegao123 2010-12-11  
创建一个对象并没有想象中的那么消耗系统资源,如果对于类库的线程安全性不了解的话,不建议弄成这种私有静态字段的。

另外,sun 及 com.sun 开头的包都是 JRE 类库,不同的 Java 实现厂商的 JRE 是不一样的,sun 的官网上也指出不要在应用程序中使用 sun 或 com.sun 开头包中的类。

用 Apache Commons Codec 中的类库吧。
8 楼 glamey 2010-12-10  
我的天啊,以前还没碰到呢,试试先自己。
7 楼 jiangshaolin 2010-12-10  
huangsky 写道
楼主,高并发,高到多高??



100的并发下,会有2-4个解密失败,500并发,会更多。
6 楼 huangsky 2010-12-10  
jiangshaolin 写道
为减少对象创建次数,一般会做如下编码:

package com.***.frame.util;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Util {
	private static final BASE64Decoder decoder = new BASE64Decoder();
	private static final BASE64Encoder encoder = new BASE64Encoder();
	/**
	 * BASE64解密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String decryptBASE64(String key) throws Exception {
		if(key==null||key.length()<1){
			return "";
		}
		return new String(decoder.decodeBuffer(key));
	}

	/**
	 * BASE64加密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String encryptBASE64(String key) throws Exception {
		if(key==null||key.length()<1){
			return "";
		}
		return new String(encoder.encodeBuffer(key.getBytes()));
	}
}



此类看似没问题,在高并发下,存在解密失败的情况,无法还原出正确的原字符串。正确的做法如下:

	/**
	 * BASE64解密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String decryptBASE64(String key) throws Exception {
		if(key==null||key.length()<1){
			return "";
		}
		return new String(new BASE64Decoder().decodeBuffer(key));
	}

	/**
	 * BASE64加密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String encryptBASE64(String key) throws Exception {
		if(key==null||key.length()<1){
			return "";
		}
		return new String(new BASE64Encoder().encodeBuffer(key.getBytes()));
	}



具体细节待查。


楼主,高并发,高到多高??
5 楼 mdream 2010-12-10  
原来还真没有注意,居然Base64非线程安全.以后在处理大并发量的时候要注意了.
4 楼 yvfish 2010-12-10  
joe9i0 写道
意思就是并发的时候多个线程要使用独占的Base64解密对象来执行解密操作.
说明Base64解密类不是线程安全的.....

+1
3 楼 79091304 2010-12-10  
感觉这不是加密的问题啊~好像是对象的创建与线程的问题啊!
2 楼 jiangshaolin 2010-12-09  
joe9i0 写道
意思就是并发的时候多个线程要使用独占的Base64解密对象来执行解密操作.
说明Base64解密类不是线程安全的.....


具体原因还没去查。
1 楼 joe9i0 2010-12-09  
意思就是并发的时候多个线程要使用独占的Base64解密对象来执行解密操作.
说明Base64解密类不是线程安全的.....

相关推荐

    封装的C++BASE64工具

    C++中实现BASE64工具类的关键在于设计高效的编码和解码算法。编码通常包括以下步骤: 1. 将输入的二进制数据按每3字节分割。 2. 将每3字节的数据转换为4个6位的二进制数。 3. 使用BASE64字符集映射这些6位的二进制数...

    Base64加密解密.zip

    在C#中,`System.Convert`类提供了`ToBase64String`和`FromBase64String`两个静态方法,分别用于Base64编码和解码。下面是如何在C# WinForm应用中使用这两个方法的示例: ```csharp using System; using System....

    图片url和base64位相互转换

    图片url转base64位,base64位的数据转换成图片,附带工具类

    .NET 中实现 Base64 编码

    类库可能包括一个或多个类,如Base64Encoder和Base64Decoder,分别负责编码和解码操作,同时可能提供了异步支持以适应高并发环境。 而Base64Demo项目则是对Base64Coder类库的使用示例。这个示例可能包含各种使用...

    javabase64-1.3.1__包 和使用实例.rar

    Java Base64库是用于编码和解码Base64数据的工具,它是Java 8及更高版本的标准库的一部分。在Java 8之前,如果需要进行Base64操作,开发者通常会依赖第三方库,如Apache Commons Codec或者Google的Guava库。然而,自...

    50个左右的JAVA工具类,相对比较全

    8. **编码解码工具类**:如Base64编码解码,可以在Java 8的java.util.Base64中找到,或者Apache Commons Codec库提供了更多编码方式。 9. **线程并发工具类**:Java的java.util.concurrent包提供了线程池、同步工具...

    BASE64All源码与jar包

    在Java中,`sun.misc.BASE64Decoder`和`sun.misc.BASE64Encoder`是两个内建的类,用于实现BASE64的编码和解码功能。 `BASE64Encoder`类提供了将二进制数据编码为BASE64字符串的方法。例如,你可以创建一个`BASE64...

    java操作工具类

    10. **编码解码工具类**: 包括字符编码转换、Base64编码解码、Hex编码解码等。`CodecUtils`可能包含这些功能,方便进行数据的编码和解码。 以上只是`opslabJutil-master`可能包含的一些核心功能模块,实际的工具...

    MD5工具类,+数据加密

    MD5工具类在Java中的实现主要依赖于`java.security.MessageDigest`类。这个类提供了各种摘要算法的实例,包括MD5。下面我们将详细介绍如何创建一个简单的MD5工具类,并讨论其在数据加密中的应用。 首先,我们需要...

    java常用工具类封装

    在Java编程中,工具类(Util Classes)是包含各种实用方法的静态类,它们提供了一种简化常见任务的方式。"java常用工具类封装"是指将常见的功能如线程管理、数据解析、第三方库集成等进行封装,以提高代码的可重用性...

    java高效开发26个工具类

    在Java编程领域,工具类(Utility Class)是程序员日常工作中不可或缺的部分。这些工具类提供了许多通用的方法,可以显著提高开发效率。"java高效开发26个工具类"这个资源包含了26个精心设计的工具类,每个类都含有...

    java工具类28+26.rar

    10. **编码解码工具类**:如EncodeDecodeUtil,可能包括Base64编码、Hex编码、URL编码等,对于数据传输和存储中的编码问题很有用。 11. **异常处理工具类**:如ExceptionUtil,可能包含异常的捕获、包装、转换等...

    java常用工具类整理

    "java常用工具类整理"这个主题涵盖了Java开发中常用的工具类,这些类在日常编程中非常实用,能大大提高开发效率。这里我们将深入探讨一些常见的Java工具类,并结合`com-jarvis-base`这个文件名,推测这是一个基础...

    28个java常用的工具类.rar

    8. **编码解码**:在网络通信或数据存储中,经常需要进行编码和解码操作,如Base64、URL编码等,工具类会提供这些功能。 9. **异常处理**:工具类可能会提供一些通用的异常处理方法,如异常的捕获、转换、包装等,...

    史上最全的dotnet工具类基类大全

    本文将深入探讨“史上最全的dotnet工具类基类大全”,旨在为.NET程序员提供一个全面的参考资料,帮助他们更好地理解和利用这些基类来提升开发效率。 首先,让我们了解什么是.NET基类。在.NET环境中,基类通常指的是...

    28个java常用的工具类

    12. **编码解码工具类**:如`CodecUtils`,包含了各种编码和解码方法,例如`encodeBase64()`用于Base64编码,`decodeHex()`用于十六进制解码。 13. **URL处理工具类**:`UrlUtils`可以帮助处理URL,包括构建、解析...

    Java整理的基础工具类项目

    9. **编码与解码**:在处理数据传输或存储时,可能会遇到编码解码的问题,工具类会提供对应的转换方法,如Base64、Hex编码等。 10. **数学计算**:工具类可能包含了一些数学运算的封装,比如随机数生成、加减乘除、...

    java常用工具类

    12. **`java.util.concurrent`** 包:提供了线程安全的数据结构和并发工具类,如`ConcurrentHashMap`, `ExecutorService`, `Future`, `Semaphore`等,用于高效地进行多线程编程。 13. **`java.util.stream.Stream`*...

    工具类

    7. **线程和并发**:工具类可能包含线程安全的操作,如原子操作类`Atomic*`,线程池管理`ExecutorService`,或者并发控制`Semaphore`, `CyclicBarrier`, `CountDownLatch`等。 8. **异常处理**:`ExceptionUtils`类...

    java工具类

    2. **Guava**:Google推出的Guava库提供了许多高级数据结构、集合操作、缓存机制以及并发工具类,极大地提高了开发效率。 3. **Java Collections Framework**:Java内置的集合框架,包括List、Set、Map接口以及它们...

Global site tag (gtag.js) - Google Analytics