去年,我们遇到了所谓的Java对象反序列化漏洞(看上去不是Java的问题),它正在反序列化对象,这可能会导致远程代码执行(RCE)或拒绝服务(DoS)攻击。
有关详细信息,请参阅https://dzone.com/articles/java-serialization-vulnerability-threatens-million。
基本上,如果代码无法验证传入的对象,则很容易受到攻击。
如Java中反序列化不可信数据的安全性影响所述,此攻击的影响将非常大 。
首先,攻击者使用从类InvokerTransformer从阿帕奇百科全书集合的方式来构建攻击链。
解决方案1:列入黑名单不接受用于构建小工具链的类。
但是,这还不够,因为可以通过许多其他方式构建攻击链。参考,
https://github.com/frohoff/ysoserial/tree/master/src/main/java/ysoserial/payloads
解决方案2:列入白名单,方法是使用“ SecureObjectStream”覆盖ObjectStream,该对象将验证应用程序实际需要的类。
同样,这并不能完全消除攻击。有使用jre7u21的RCE和使用HashSets的拒绝服务攻击。
解决方案3:关闭反序列化最好的方法。
在无法忽略反序列化的情况下,除了黑白名单以外,还有没有更好的方法来验证和阻止坏数据在爆炸之前爆炸?
我正在开发一个多线程应用程序,并使用Cassandra作为后端.
之前,我为每个子线程创建了一个单独的会话,并在执行后杀死线程之前关闭了会话.但后来我认为这可能是一项昂贵的工作,所以我现在设计它就像,我在服务器启动时打开了一个会话,任何数量的客户端都可以使用该会话进行查询.
问题:我只是想知道这是否是正确的方式,还是有更好的方法来做到这一点?我知道连接池是一种选择,但在这种情况下真的需要吗?
当我尝试使用相同的密钥再次加密密文时,它会生成原始的明文。
使用的算法是带有计数器模式的AES。Key和IV保持不变。
这是算法应该表现的方式吗?如果作为 Cipher.init() 的第一个参数给出的Cipher.ENCRYTMODE有什么用?
这是我测试过的示例程序,
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class EncryptionTest {
public static void main(String[] args) throws Exception {
SecretKeySpec key = null;
IvParameterSpec ivSpec = null;
byte[] keyBytes = "usethiskeyusethiusethiskeyusethi".getBytes();
byte[] ivBytes = "usethisIusethisI".getBytes();
key = new SecretKeySpec(keyBytes, "AES"); //No I18N
ivSpec = new IvParameterSpec(ivBytes);
Cipher AesCipher = Cipher.getInstance("AES/CTR/NoPadding");
byte[] byteText = "Your Plain Text Here".getBytes();
AesCipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] byteCipherText = AesCipher.doFinal(byteText);
System.out.println("Encrypted : …Run Code Online (Sandbox Code Playgroud) java ×2
aes ×1
c++ ×1
cassandra ×1
client ×1
ctr-mode ×1
encryption ×1
javax.crypto ×1
security ×1