这两天程序做压力测试,发现了一个问题,在用jdk提供的des加密时,当访问量过大时,加解密时突然报错
java.lang.IllegalStateException: Cipher not initialized
at javax.crypto.Cipher.c(DashoA12275)
at javax.crypto.Cipher.doFinal(DashoA12275)
at com.changda.encrypt.DESEngine.encrypt(DESEngine.java:67)
at com.changda.encrypt.DESEngine.encrypt(DESEngine.java:106)
at com.changda.clientapi.BaseCall.creatKey(BaseCall.java:220)
at com.changda.util.SendXNMRequest.sendRequest(SendXNMRequest.java:50)
at com.changda.business.service.AccountServiceImpl.login(AccountServiceImpl.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:139)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy1.login(Unknown Source)
at com.changda.struts.action.LoginAction.execute(LoginAction.java:71)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.changda.util.ParseConfigfile.doFilter(ParseConfigfile.java:18)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.mas.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:122)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595)
看错误是Cipher未初始化,可代码中肯定初始化了,怀疑是jdk本身没来得及初始化,原程序中的做法是,每次解加解密,都创建一个Cipher对象,现改为,有几个密钥就创建几个静态的Cipher对象,放在hashmap中,问题解决。
修改后的java des加密 程序如下:
import java.security.*;
import java.util.HashMap;
import javax.crypto.*;
public class DESEngine {
private static HashMap encryptCipherMap=new HashMap();
private static HashMap decryptCipherMap=new HashMap();
public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
while (intTmp < 0) {
intTmp = intTmp + 256;
}
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
public byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
String strTmp = new String(arrB, i, 2);
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}
private static DESEngine single = new DESEngine();
private DESEngine() {
}
public static DESEngine getInstance() {
return single;
}
private void init(String strKey)throws Exception{
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());
if(encryptCipherMap.get(strKey)==null){
Cipher encryptCipher = Cipher.getInstance("DES/ECB/NoPadding","SunJCE");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
encryptCipherMap.put(strKey, encryptCipher);
}
if(decryptCipherMap.get(key)==null){
Cipher decryptCipher = Cipher.getInstance("DES/ECB/NoPadding","SunJCE");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
decryptCipherMap.put(strKey, decryptCipher);
}
}
public byte[] encrypt(byte[] arrB,String key) throws Exception {
return ((Cipher)encryptCipherMap.get(key)).doFinal(arrB);
}
public byte[] decrypt(byte[] arrB,String key) throws Exception {
return ((Cipher)decryptCipherMap.get(key)).doFinal(arrB);
}
private Key getKey(byte[] arrBTmp) throws Exception {
byte[] arrB = new byte[8];
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
return key;
}
public String encrypt(String key,String strIn) throws Exception {
this.init(key);
byte[] inb = strIn.getBytes();
int length = inb.length;
int mod = length % 8;
if (mod != 0) {
mod = 8 - mod;
}
byte[] newin = new byte[length + mod];
for (int u = 0; u < length; u++) {
newin[u] = inb[u];
}
//给存储明文的字节数组a的不足位补0
for (int u = length; u < newin.length; u++) {
newin[u] = 0;
}
return byteArr2HexStr(encrypt(newin,key));
}
public String decrypt(String key,String strIn) throws Exception {
this.init(key);
return new String(decrypt(hexStr2ByteArr(strIn),key));
}
}
分享到:
相关推荐
### 利用DES加密算法保护Java源代码 #### 一、引言 随着信息技术的快速发展,数据的安全性问题越来越受到人们的重视。对于软件开发者来说,保护自己的Java源代码不被非法访问或篡改是非常重要的。Java作为一种跨...
1. **DES加密算法**: DES是一种对称加密算法,它使用相同的密钥进行加密和解密。在Java中,可以使用`javax.crypto`包下的`Cipher`类来实现DES加密。首先,需要创建一个DES密钥,然后使用`Cipher`的`init`方法初始...
### DES加密算法实验知识点 #### 一、实验背景与意义 **数据加密标准(Data Encryption Standard,简称DES)**是一种广泛使用的对称密钥加密技术。它最初由IBM开发,并于1977年被美国国家标准局(NBS,现为NIST)...
3. `des.js`: DES加密算法的具体实现。 4. `md5.js`: MD5哈希函数,虽然不是直接用于DES,但可能是用于其他目的,如密码存储。 5. `mode-ecb.js`: ECB(Electronic Codebook)模式,这是DES的一种工作模式,其中每个...
标题 "3DES加密解密" 涉及到的是数据安全领域中的一种常见的对称加密算法——三重DES(Triple DES)。此算法是基于原始的DES(Data Encryption Standard)算法,通过三次加密过程增强了其安全性。以下是关于3DES及其...
java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
Java 加密解密之对称加密算法 DES 是一种常用的对称加密算法,广泛应用于保护金融数据的安全中。它的全称是 Data Encryption Algorithm(DEA),最早由 IBM 开发,并曾拥有专利权,后来在 1983 年专利权到期,变为...
**AES加密算法** AES,全称为“高级加密标准”(Advanced Encryption Standard),是目前广泛使用的对称加密算法,由比利时...通过阅读和运行这些源码,可以加深对AES加密算法的理解,并掌握其在Java中的实际应用。
本文将详细介绍Java中常见的加密算法的实现,以及如何在JDK 1.8环境下进行操作。 1. **对称加密算法** 对称加密是最基础的加密方式,使用相同的密钥进行加密和解密。Java中提供了`javax.crypto`包来支持此类算法,...
"Java实现的对称加密算法AES定义与用法详解" 对称加密算法AES是当前使用最多的加密算法之一,其主要特点是高级的、安全的、快速的和灵活的。下面我们将详细介绍Java实现的对称加密算法AES的定义、特点、用法及使用...
在Java项目中,这些库可以作为外部依赖导入,以便在不包含在JDK标准库中的加密算法上进行操作。 在实际应用中,3DES虽然比DES安全,但仍然面临密钥长度较短的问题,因为3DES的最有效密钥长度仅为112位。如今,更...
DESServiceECB.jar 实现了DES的ECB模式下的算法,允许对字符串、字节、文件的加密.
在JDK8中,JCE(Java Cryptography Extension)的一个关键更新是它开始支持256位加密算法,这在之前的版本中可能是受限的。这一增强对于那些需要处理大量敏感数据和要求更高安全性的应用程序来说是非常重要的。 JCE...
总结起来,这个压缩包提供了在Java 1.4环境中使用Bouncy Castle库实现MD5、SHA-1、DES、DESede和RSA等加密算法的资源。开发者可以通过这些源代码学习如何在Java中安全地处理敏感信息,尤其是对于那些需要兼容旧版本...
在实际应用中,为了提高安全性,通常会使用更强大的加密算法,如AES(Advanced Encryption Standard),它比DES提供了更高的安全性,支持多种密钥长度,如128位、192位和256位,且加解密效率较高。 在Java中使用AES...
Java中的DES(Data Encryption Standard)是对称加密算法的一种,它基于IBM的研究工作,并在1977年被美国政府采纳为标准。DES算法使用56位的密钥和额外的8位奇偶校验位来处理64位的数据块。由于其结构特性,它采用...
4. 库的使用:压缩包中的`bcprov-jdk16-146.jar`是Bouncy Castle库的一个版本,它提供了对非标准加密算法的支持,包括3DES。在Java中,我们可能需要引入这个库来处理加密。而`commons-codec-1.3.jar`是Apache ...
通过不同的示例代码,项目涵盖了Base64、DES、IDEA、MD5、RSA和SHA1等多种加密算法的实现。每个示例都详细展示了如何使用Java语言和相关库来实现这些加密和解密操作。 主要内容 Base64Demo: 演示了如何使用...
Java对称加密算法DES实例...DES算法是一种古老的对称加密算法,Java中可以使用JDK和Bouncy Castle库实现DES算法。然而,DES算法已经不再安全,已经被破解多次,现在已经不建议使用该算法,而是使用更安全的加密算法。
- **目的**: 本研究旨在提出一种结合DES加密算法的二维码存取技术,以增强二维码中隐私数据的安全性。 - **意义**: - **提高安全性**: 通过对二维码中的数据进行加密处理,可以有效防止数据在传输过程中的泄露。 -...