请问对用户密码加密应该使用什么算法?DES合适吗?
我尝试把用户密码用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




