相关疑难解决方法(0)

试图了解Java RSA密钥大小

钥匙发生器的尺寸为1024,那么为什么印刷尺寸为635和162?

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

public class TEST {

    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException {
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
    keyPairGenerator.initialize(1024);
    return keyPairGenerator.generateKeyPair();
    }

    public static void main(String[] args) throws Exception {

    KeyPair keyPair = generateKeyPair();
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

    System.out.println("Size = " + privateKey.getEncoded().length);
    System.out.println("Size = " + publicKey.getEncoded().length);

    }

}
Run Code Online (Sandbox Code Playgroud)

java encryption rsa

10
推荐指数
2
解决办法
2万
查看次数

拒绝基于RSA公钥大小的双向TLS gRPC连接

我有一台使用相互TLS进行加密和身份验证的gRPC服务器。因此,每个连接到该服务器的客户端都提供一个SSL证书,我想拒绝来自公共密钥大小小于2048位的客户端的连接。似乎还没有直接的方法可以做到这一点。

我能够用ServerInterceptor这种方式做到这一点

public class SSLInterceptor implements ServerInterceptor {
    @Override
    public <ReqT, RespT> Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
        try {
            SSLSession sslSession = call.getAttributes().get(Grpc.TRANSPORT_ATTR_SSL_SESSION);
            RSAPublicKeyImpl pk = (RSAPublicKeyImpl) sslSession.getPeerCertificates()[0].getPublicKey();
            if (pk.getModulus().bitLength() < 2048) {
                // reject call
            }
            // proceed with the call
        } catch (SSLPeerUnverifiedException e) {
            // do something
        }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个不好的方法,因为

  1. 在建立连接之后进行验证。
  2. 仅当发出请求/调用时才触发验证。
  3. 每个调用都涉及额外的验证开销。
  4. 如果验证失败,则仅拒绝呼叫,而不拒绝与客户端的连接。

在理想情况下

  1. 验证在连接建立阶段完成。(或在客户端和服务器之间的通道创建过程中的某个时间点)
  2. 验证失败将阻止创建连接,并且无法建立连接并稍后断开连接。
  3. 每个会话仅对客户端进行一次验证,并且在该会话期间进行的所有调用都不会产生任何开销。

我该如何做得更好?

validation ssl public-key grpc grpc-java

5
推荐指数
1
解决办法
125
查看次数

标签 统计

encryption ×1

grpc ×1

grpc-java ×1

java ×1

public-key ×1

rsa ×1

ssl ×1

validation ×1