Java Kryonet RSAPublicKeyImpl未注册

问题描述 投票:0回答:1

我正在尝试使用connection.sendTCP(key);从Kryonet服务器向客户端发送PublicKey(java.security.PublicKey)我这样做时会遇到此异常:

Exception in thread "pool-1-thread-1" java.lang.IllegalArgumentException: Class is not registered: sun.security.rsa.RSAPublicKeyImpl
Note: To register this class use: kryo.register(sun.security.rsa.RSAPublicKeyImpl.class);
at com.esotericsoftware.kryo.Kryo.getRegistration(Kryo.java:443)
at com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:73)
at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:475)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
at com.esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50)
at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192)
at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59)
at darpix.accountManager.AccountManager$1.received(AccountManager.java:93)
at com.esotericsoftware.kryonet.Listener$QueuedListener$3.run(Listener.java:102)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

我已经注册了这五个课程:

k.register(AccountRequest.class);
k.register(AccountResponse.class);
k.register(KeyResponse.class);
k.register(PublicKey.class);
k.register(byte[].class);

我没有在我的代码中的任何地方使用RSAPublicKeyImpl,我似乎无法在我正在使用的库中找到它。

java kryo kryonet
1个回答
0
投票

可能不是一个完整的答案,但评论太多了。

Java加密(JCA / JCE)发布(文档)一系列通用的“外观”类,如Signature Cipher Key等,但各种算法和变体的实际实现类由一组可变的cryptoproviders提供,可能因cryptoproviders或版本,并且不会发布或稳定 - 除了符合OO规则所要求的父类和接口。许多但并非所有这些实现类都在sun.*com.sun.*下。

通常的Java序列化和反序列化未定义为可用于加密对象。传输或存储密钥的正确方法不是使用密钥对象,而是使用密钥的编码,该密钥是定义为在实现和版本之间稳定的标准化字节序列。

在发送者中,您可以调用由Key.getEncoded()PublicKey继承的PrivateKey,尽管他们使用的编码是不同的(分别是X.509和PKCS#8)并发送结果字节。在接收器中使用KeyFactory.getInstance(algorithm[,provider])获得正确算法的关键工厂,然后分别使用包含X.509或PKCS#8编码的.generatePublic.generatePrivate调用X509EncodedKeySpecPKCS8EncodedKeySpec。注意接收器需要知道算法,可能需要另外发送;这在技术上是多余的,因为算法标识符包含在(标准)PKCS#8和X.509编码中,但不能提取。

我不知道如何(或如果)将其与kryo整合。

请注意,支持外部化未加密的私钥,但通常不安全。通常最好在KeyStore中传输或存储包含私钥的密钥对,.store使用.load和qazxswpoi以加密形式从流(通常是文件)序列化或反序列化。虽然公钥不需要加密,但通常不安全地传输或存储它们是不安全的,这通常通过将它们放入证书(通常是X.509v3证书)来完成,证书类似地被编码为字节序列(即实际上已经广泛实施了)。

© www.soinside.com 2019 - 2024. All rights reserved.