我正在开发一个Java应用程序,我需要做一个对称加密来保护我的一些敏感信息。Java密码学中有许多算法,如AES、DE3 DES等。我应该使用什么算法来加密我的敏感信息?
大多数情况下,我确实有字符串值,并且有几个实例需要保护Java对象。
发布于 2017-01-09 22:33:16
推荐的算法是AES-128 (或更高版本)。
您还应该使用随机初始化向量选择一个很好的链接方法。填充可变长度源数据是有用的,因为AES是一种块算法。AES/CBC/PKCS5Padding是一个很好的选择。
加密密钥应从加密安全(伪)随机数生成器中生成。(即Java的SecureRandom)
或者,可以使用适当的密钥派生函数从相当强的密码派生加密密钥。(在这里比较)
我假设你需要在休息时加密数据。必须考虑密钥管理。
如果您需要在传输过程中加密数据,您还需要MITM和完整性验证,这是最好用TLS完成的。(HTTPS)
发布于 2017-01-09 22:43:19
如果您想保护一个Java对象,您需要使用SealedObject类。
下面是一个示例代码。
使用AES-128位并作为密封对象写入文件。
try {
//Generate a key
KeyGenerator gen = KeyGenerator.getInstance("AES");
gen.init(128);
Key sKey = gen.generateKey();
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.ENCRYPT_MODE,sKey);
// do the sealing
Car car=new Car("My car ",2014);
SealedObject so = new SealedObject(car,c);
FileOutputStream out = new FileOutputStream("Objects.obj");
ObjectOutputStream oOut = new ObjectOutputStream(out);
//Save the key
oOut.writeObject(sKey);
//Save the sealed object
oOut.writeObject(so);
oOut.close();
System.out.println("SealedObject was written to Object file");
} catch (Exception e) {
System.out.println(e);
}
}解密过程如下。它读取密封的对象并使用相同的密钥解密。
try {
FileInputStream in = new FileInputStream("Objects.obj");
ObjectInputStream oIn = new ObjectInputStream(in);
//Read the key
Key sKey= (Key) oIn.readObject();
//Read the sealed object
SealedObject so= (SealedObject) oIn.readObject();
//unsealded the object
Car car = (Car) so.getObject(sKey);
car.getNo();
car.getYear();
} catch (Exception e) {
System.out.println(e);
}保护对称密钥在这里是非常重要的,但它是一个离题。
AES(256)是现代标准,它被美国联邦和其他组织所使用。AES有128,192和256位加密。DES被认为是“老”的,它有许多脆弱性。DES的继承者为3 DES。3 DES缓解了DES中发现的许多漏洞。但是当涉及到软件实现时,它被认为是缓慢的,因为它将在3次内应用DES。
所以,当你有疑问的时候,一定要使用AES。
发布于 2017-01-09 22:21:45
DES和3 DES不再被认为是强加密了。看看Rijndael,java有一个可用的实现(只是搜索堆栈溢出)。确保你阅读了如何使用盐和如何安全地储存你的钥匙。
https://security.stackexchange.com/questions/147830
复制相似问题