【发布时间】:2014-06-02 06:01:10
【问题描述】:
好的,我想知道我目前加密网络连接的方法(将在接下来的几行中解释)是安全有效的。
另外我想记住,我想使用尽可能少的字节(传输),因为这可能用于 Android。
我目前的方法是使用两种加密方法:RSA(keysize= 512) 和 AES(keysize= 128)
我所做的是:
- 服务器生成一个 RSA 公钥和一个私钥。
- 当客户端连接时,服务器将公共 RSA 密钥发送给客户端。
- 客户端生成一个 AES 密钥并使用服务器提供的公共 RSA 密钥对 AES 密钥进行加密。
- 客户端发送其加密的 AES 密钥,服务器使用私有 RSA 密钥解密加密的 AES 密钥。
现在,如果我是正确的,就不可能从客户端嗅探任何数据包,因为您不可能解密 AES 密钥(没有私钥)。
这是一种安全的方式吗?还是某处有某种后门?
这不是我唯一的问题;
因为我的应用程序是用 Java 构建的,所以总是可以对其进行逆向工程。既然客户端生成了 AES Key 并保存在内存中,那么是否有可能拿到 AES Key?
最后一个问题: 使用此代码生成密钥对大约需要 300 毫秒:
我想听听你们的意见和/或改进。
private RSAKeySet(RSAPublicKey publicKey, PrivateKey privateKey) {
this.publicKey = publicKey;
this.privateKey = privateKey;
byte[] mod = publicKey.getModulus().toByteArray();
byte[] exp = publicKey.getPublicExponent().toByteArray();
localPublicKeySpec = ByteBuffer.allocate(mod.length + exp.length + 8);
localPublicKeySpec.putInt(mod.length);
localPublicKeySpec.put(mod);
localPublicKeySpec.putInt(exp.length);
localPublicKeySpec.put(exp);
localPublicKeySpec.flip();
}
public static final RSAKeySet generateKeys(int keySize) throws GeneralSecurityException {
RSAKeySet set;
long start = System.currentTimeMillis();
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(keySize);
KeyPair kp = kpg.genKeyPair();
set = new RSAKeySet((RSAPublicKey) kp.getPublic(), kp.getPrivate());
System.err.println("RSA keys generated (" + (System.currentTimeMillis() - start) + "ms)");
return set;
}
我用的是 Netty,300ms 能负担得起吗?
提前致谢。
【问题讨论】:
标签: java security aes rsa netty