在这里我添加密码和连接到他们的网站到我的数据库,我认为这工作很好。当我检查数据库时,我可以在数据库中看到加密密码:
public static void lisaa(PreparedStatement statement, ResultSet resultSet,
Connection connection, Scanner lukija, Kryptaaja kc)throws SQLException,
Exception {
System.out.println("Sivu salasanalle: ");
String sivu = lukija.nextLine();
System.out.println("Salasana: ");
String ss = lukija.nextLine();
String[] sanabytes = new String[] {ss};
statement = connection.prepareStatement("INSERT INTO PASSWORDS (sivu,
salasana) VALUES(?, ?)");
statement.setString(1, sivu);
statement.setString(2, kc.kryptaa(sanabytes));
statement.executeUpdate();
}
从数据库中检索加密密码并尝试打印它们的方法:
public static void tulosta(PreparedStatement statement, ResultSet resultSet,
Connection connection, Kryptaaja kc)throws SQLException, Exception {
statement = connection.prepareStatement("select * from PASSWORDS");
resultSet = statement.executeQuery();
boolean onko = false;
while (resultSet.next()) {
onko = true;
String sivu = resultSet.getString("sivu");
String ss = resultSet.getString("salasana");
String[] sanabytes = new String[]{ss};
String dekryptattu = kc.tulkkaa(sanabytes);
System.out.println(sivu + ": " + dekryptattu );
}
if (!onko) {
System.out.println("ei kappaleita!");
}
}
public Kryptaaja(){
}
public String kryptaa (String[] args) throws Exception {
//
// Check args and get plaintext
if (args.length !=1) {
System.err.println("Usage: java PrivateExample text");
System.exit(1);
}
byte[] plainText = args[0].getBytes("UTF8");
//
// Get a DES private key
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
// If you do not initialize the KeyGenerator, each provider supply a default initialization.
keyGen.init(56);
Key key = keyGen.generateKey();
//
// Creates the DES Cipher object (specifying the algorithm, mode, and padding).
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// Print the provider information
//
// Initializes the Cipher object.
cipher.init(Cipher.ENCRYPT_MODE, key);
// Encrypt the plaintext using the public key
byte[] cipherText = cipher.doFinal(plainText);
String kryptattu = Base64.getEncoder().encodeToString(cipherText);
String erikryptattu = ( new String(cipherText, "UTF8") );
return kryptattu;
}
public String tulkkaa (String[] args) throws Exception {
//
// Check args and get plaintext
if (args.length !=1) {
System.err.println("Usage: java PrivateExample text");
System.exit(1);
}
byte[] krypted = args[0].getBytes("UTF8");
//
// Get a DES private key
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
// If you do not initialize the KeyGenerator, each provider supply a default initialization.
keyGen.init(56);
Key key = keyGen.generateKey();
//
// Creates the DES Cipher object (specifying the algorithm, mode, and padding).
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// Initializes the Cipher object.
cipher.init(Cipher.DECRYPT_MODE, key);
// Decrypt the ciphertext using the same key
byte[] newPlainText = cipher.doFinal(krypted);
String sana = Base64.getEncoder().encodeToString(newPlainText);
String eri =( new String(newPlainText, "UTF8") );
return sana;
}
}
首先,除非您真正知道自己在做什么,否则加密密码(而不是比较正确的密码哈希,而不是普通的加密哈希)是个坏主意。用DES和ECB加密密码是一个糟糕的想法,前者已经被破坏了20年,后者的块大小很小,甚至不解密就可以破坏许多值。但是,安全性是security.sx的主题,而不是stackoverflow的主题,所以我假设您实际上并不想拥有安全性。
您最大的问题是生成两个不同的密钥:使用一个密钥加密,然后尝试使用不同的密钥解密。这是完全打破的;传统的(形式上,对称的)密码学的基础,从历史开始就是加密和解密使用相同的密钥。即使是现代的“非对称”公钥密码学也使用配对的密钥:给定一个P1键,你可以用P1的公共部分加密,用P1的私人部分解密,但不能用一些不同的P2或PX键。
由于要存储要在以后解密的加密html" target="_blank">数据,因此需要存储用于解密的密钥,以防止未授权方使用密钥。这是所谓的密钥管理的(一部分),也是实现安全性的实际困难部分,比简单的加密和解密要困难得多。你对你想做什么以及在什么环境中做什么的信息太少了,以至于我无法给出任何具体的建议。
如果更改为比ECB更好的模式,还需要为每个加密值存储初始化向量(IV)(或等效值),但这更容易,因为IVs不需要是机密的。
您的代码字符串erikryptattu=(new String(cipherText,“UTF8”);
将是另一个错误,除非这是死代码;你从不使用这个值。
对于电子和计算机密码学(即自1950年以来),密文值(以及散列、MACs和签名)基本上是任意的随机比特;它不是字符,并且试图像Javastring
那样将其视为字符,通常会损坏它,特别是会更改密文,使其无法解密(即使使用正确的密钥和IV)。所以别那么做。使用base64,就像您的实时代码一样,是处理任意位的一种好方法。
但你需要完全做到。您的解密例程tulkkaa
需要在解密密文之前对密文进行base64解码。
所有人。我基本上是试图加密和解密一个字符串类型的密码。我得到的错误是javax . crypto . illegalblocksizeexception:使用填充密码解密时,输入长度必须是8的倍数。 我尝试用指定的填充做其他算法,例如AES/CBC/NoPadding。但得到不同的错误是Java . security . invalidkeyexception:无效的AES密钥长度:5个字节。
虽然对于调试来说,当我试图解密(使用相同的代码)app1上的加密url时,它工作得很好。但不知道是什么原因导致了APP2的异常? 这是代码
我有一个安全课程的项目,但我有一个问题。 基本上,我试图加密然后解密一个密码,但我得到这个解密错误。 我这样做对吗。我在关注2012年的一篇文章。还安全吗? 我还尝试替换算法,但似乎没有任何效果: “AES”、“RSA/ECB/PKCS1Padding”、“PbeWithHMACSHA256andDesede”..以及更多
服务器端: 客户端(解密):
服务器端: 客户端(解密):
我正在尝试解密服务器上的加密字符串。但当我解密的时候,我发现了错误。我需要成功解密字符串。我们正在使用AES 256 cbc 当我使用aes/cbc/nopadding时,我能够解密,但是文本中附加了垃圾字符。 解密A:2:{S:5:“电子邮件”;S:24:“afroj.alam@broc.com”;S:8:“密码”;S:7:“test123”;} 实际字符串A:2:{S:5:“email”;S: