CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 扩展类

请问对用户密码加密应该使用什么算法?DES合适吗?

楼主Digitaldancer(Pavel)2005-08-04 11:44:47 在 Java / J2SE / 扩展类 提问

我尝试把用户密码用DES加密后存到数据库中,再取出来解密时老出错。我把字符串格式强制转换成ISO_8859_1都不行,出现“Input   length   (with   padding)   not   multiple   of   8   bytes”错误。似乎DES不适合对字符串进行加密,只用来对大文件加密。请问应该用什么加密方法? 问题点数:50、回复次数:9Top

1 楼homesos(熊猫贩子)回复于 2005-08-04 12:27:40 得分 20

DES适合对字符串进行加解密,可用。  
  其它的加密方法,一般只加密不解密。Top

2 楼Digitaldancer(Pavel)回复于 2005-08-04 17:30:35 得分 0

DES似乎更适合给大文件的字节流进行加密。  
   
  我给字符串加密时,使用  
  String   algorithm   =   "DES";  
                          Cipher   cipher   =   Cipher.getInstance(algorithm);  
                          cipher.init(Cipher.ENCRYPT_MODE,   deskey);  
                          byte[]   cipherByte   =   cipher.doFinal(message.getBytes());  
                          str   =   new   String(cipherByte,"GBK");  
   
  然后把这个str字符串写入MySQL数据库,再从数据库中取出来时,发现字符串就  
  跟原来的不一样了,可能跟数据库字符集有关。windows的字符集好像是GBK,  
  所以我把编码格式转成GBK,在从数据库中取出来时也转换成GBK,但还是跟插进  
  去的不一致。  
  把取出来的字符串转换成byte数组进行解密时就会失败。Top

3 楼homesos(熊猫贩子)回复于 2005-08-05 10:13:10 得分 0

我用的是自己写的类(是从别人那拷来的)  
   
  进行对称加解密的,是对消息内容进行加密后写入文件,读取时再解密,使用正常,如果需要可拷给你,用用看。Top

4 楼homesos(熊猫贩子)回复于 2005-08-05 10:14:12 得分 0

/**  
    *   CryptionData.java  
    *   @version   1.0  
    *   @author   2005/4/20   Yao   (WICT)  
    */  
   
  import   javax.crypto.Cipher;  
  import   javax.crypto.SecretKey;  
  import   javax.crypto.SecretKeyFactory;  
  import   javax.crypto.spec.*;  
  import   sun.misc.*;  
   
  /**  
    *   DES   encryption   algorithm,   providing   the   encryption   and   decryption  
    *   algorithm   for   byte   array   and   string  
    *   @author   :   Yao   (WICT)  
    *   @version   1.0  
    */  
  public   class   CryptionData  
  {  
  //   The   length   of   Encryptionstring   should   be   8   bytes   and   not   be  
  //   a   weak   key  
  private   String   EncryptionString;  
   
  //   The   initialization   vector   should   be   8   bytes  
  private   final   byte[]   EncryptionIV   =   "abcdefgh".getBytes();  
  private   final   static   String   DES   =   "DES/CBC/PKCS5Padding";  
   
  /**  
    *   Saving   key   for   encryption   and   decryption  
    *   @param   EncryptionString   String  
    */  
  public   CryptionData(String   EncryptionString)   {  
  this.EncryptionString   =   EncryptionString;  
  }  
   
  /**  
    *   Encrypt   a   byte   array  
    *   @param   SourceData   byte[]  
    *   @throws   Exception  
    *   @return   byte[]  
    */  
  public   byte[]   EncryptionByteData(byte[]   SourceData)   throws   Exception   {  
  byte[]   retByte   =   null;  
   
  //   Create   SecretKey   object  
   
  byte[]   EncryptionByte   =   EncryptionString.getBytes();  
  DESKeySpec   dks   =   new   DESKeySpec(EncryptionByte);  
  SecretKeyFactory   keyFactory   =   SecretKeyFactory.getInstance("DES");  
  SecretKey   securekey   =   keyFactory.generateSecret(dks);  
   
  //   Create   IvParameterSpec   object   with   initialization   vector  
  IvParameterSpec   spec=new   IvParameterSpec(EncryptionIV);  
   
  //   Create   Cipter   object  
  Cipher   cipher   =   Cipher.getInstance(DES);  
   
  //   Initialize   Cipher   object  
  cipher.init(Cipher.ENCRYPT_MODE,   securekey,   spec);  
   
  //   Encrypting   data  
  retByte   =   cipher.doFinal(SourceData);  
  return   retByte;  
  }  
   
  /**  
    *   Decrypt   a   byte   array  
    *   @param   SourceData   byte[]  
    *   @throws   Exception  
    *   @return   byte[]  
    */  
  public   byte[]   DecryptionByteData(byte[]   SourceData)   throws   Exception   {  
  byte[]   retByte   =   null;  
   
  //   Create   SecretKey   object  
  byte[]   EncryptionByte   =   EncryptionString.getBytes();  
  DESKeySpec   dks   =   new   DESKeySpec(EncryptionByte);  
  SecretKeyFactory   keyFactory   =   SecretKeyFactory.getInstance("DES");  
  SecretKey   securekey   =   keyFactory.generateSecret(dks);  
   
  //   Create   IvParameterSpec   object   with   initialization   vector  
  IvParameterSpec   spec=new   IvParameterSpec(EncryptionIV);  
   
  //   Create   Cipter   object  
  Cipher   cipher   =   Cipher.getInstance(DES);  
   
  //   Initialize   Cipher   object  
  cipher.init(Cipher.DECRYPT_MODE,   securekey,   spec);  
   
  //   Decrypting   data  
  retByte   =   cipher.doFinal(SourceData);  
   
  return   retByte;  
  }Top

5 楼homesos(熊猫贩子)回复于 2005-08-05 10:14:22 得分 0

/**  
    *   Encrypt   a   string  
    *   @param   SourceData   String  
    *   @throws   Exception  
    *   @return   String  
    */  
  public   String   EncryptionStringData(String   SourceData)   throws   Exception  
  {  
  String   retStr   =   null;  
  byte[]   retByte   =   null;  
   
  //   Transform   SourceData   to   byte   array  
  byte[]   sorData   =   SourceData.getBytes();  
   
  //   Encrypte   data  
  retByte   =   EncryptionByteData(sorData);  
   
  //   Encode   encryption   data   
  BASE64Encoder   be   =   new   BASE64Encoder();  
  retStr   =   be.encode(retByte);  
   
  return   retStr;  
  }  
   
  /**  
    *   Decrypt   a   string  
    *   @param   SourceData   String  
    *   @throws   Exception  
    *   @return   String  
    */  
  public   String   DecryptionStringData(String   SourceData)   throws   Exception   {  
  String   retStr   =   null;  
  byte[]   retByte   =   null;  
   
  //   Decode   encryption   data  
  BASE64Decoder   bd   =   new   BASE64Decoder();  
  byte[]   sorData   =   bd.decodeBuffer(SourceData);  
   
  //   Decrypting   data  
  retByte   =   DecryptionByteData(sorData);  
  retStr   =   new   String(retByte);  
   
  return   retStr;  
  }  
  }Top

6 楼linuxyf(率人哥哥)回复于 2005-08-05 10:44:42 得分 20

楼上的兄弟,你的这段代码是我写的,你用的感觉还可以吧?    
  这是今年上半年做一个外包的时候写的,   包括C#版的,   java平台和.net平台交叉加密解密  
  (算法除了DES,还有TripleDES),我们用的时候是用DES加密文件的字节流,用  
  TripleDES加密字符串的。Top

7 楼Octer()回复于 2005-08-06 23:00:44 得分 10

对于这类加密,可以采用简单的方式,只对密码做一下hash就可以了  
  不需要保存密钥,   homesos(熊猫贩子)   的方法又涉及到密钥保存问题,由此又涉及到密钥的安全性问题  
  但对称加密算法的加密速度的确很快,不过遗憾的是现在DES已经被人成功破解了Top

8 楼treeroot(旗鲁特)回复于 2005-08-07 10:24:04 得分 0

我感觉还是用MD5信息摘要比较好吧,因为这样无法通过密文获得明文,才算安全Top

9 楼Digitaldancer(Pavel)回复于 2005-08-08 19:33:56 得分 0

谢谢各位指点,已经解决了,base64编码是关键,我没做这个Top

相关问题

  • 关于DES加密算法
  • 求!!DES加密算法!!
  • <求救>DES及3DES加密算法
  • 标准DES算法加密的问题
  • 加密算法!
  • 怎样用md5加密算法对用户密码进行加密??
  • 有关huffman加密的密码的一切破译算法
  • 谁有密码加密算法!送上就给分!Yoinn@21cn.com
  • 将一段delphi加密码算法翻译为c#代码
  • c#的加密算法中密码能有多长?

关键词

  • 加密
  • 解密
  • 密码
  • 数据库
  • sourcedata
  • encryptionstring
  • retbyte
  • cipher
  • 字符串
  • des

得分解答快速导航

  • 帖主:Digitaldancer
  • homesos
  • linuxyf
  • Octer

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo