我对安全性很陌生,我想知道是否可以通过更改或添加一些东西来使程序更好/更安全。
我应该使用keyGenerator吗?我对我的程序输出有怀疑。
Encrypted Message: +g@þóv«5Ùû`ž
keybyte: [B@71e7a66b
Original string: Message
Original string (Hex): [B@2ac1fdc4public class AES {
public static void main(String ... args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
final String Algo="AES";
String key = "aaaaaaaaaaaaaaaa";
byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
MessageDigest sha= MessageDigest.getInstance("SHA-1");
keyBytes=sha.digest(keyBytes);
keyBytes=Arrays.copyOf(keyBytes, 16);
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, Algo);
Cipher cipher = Cipher.getInstance(Algo);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] ciphertext = cipher.doFinal("Message".getBytes());
System.out.println("Encrypted Message: " +new String(ciphertext));
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] original = cipher.doFinal(ciphertext);
String originalString = new String(original);
System.out.println("keybyte: "+keyBytes);
System.out.println("Original string: " + originalString + "\nOriginal string (Hex): " +original);
}
}发布于 2017-03-30 11:33:00
<插入免责声明,如果你不太了解它,就不要用自制的东西来安全。而且,我不是一个安全专家,我只能告诉你什么是明显的错误,而不是如果它是安全的。我有点抱歉,这听起来有些刺耳,但请更深入地了解这个主题,例如,密码学的挑战是一种很棒的学习方式,以防你在hand.>没有其他资源。
这样,代码在任何方面都是不安全的--形状或形式。您必须假设攻击者知道所有代码,包括任何硬编码值。否则,您应该指出它们是示例值,应该被理解为输入。
现在我们假设键是输入的;在它上运行SHA-1是可以的,但不会使它更加安全。在实践中,您可能会在上面运行一个适当的密钥推导函数,以防您不生成随机密钥。
然后,阅读文档(或者看斯塔克溢出)会告诉您,这个Java中的"AES"的默认设置是欧洲央行模式 (带有PKCS#5填充,但这并不重要)--这是不安全的,因为该段中的图片很好地说明了这一点。这也表明您不能依赖这些默认设置,因为AFAIK没有指定它们将是什么。
顺便说一下,keybyte: [B@71e7a66b显示了数组的一些内部表示,而不是实际的字节(请注意[B@模式);例如,关于这个问题的一些想法是看这儿 --在实践中,您当然是在使用一个库。
https://codereview.stackexchange.com/questions/159283
复制相似问题