xrpl4j:后端持久化生成私钥的正确实现方案
XRPL4J私钥持久化问题及解决方案
问题背景
查看xrpl4j的Java示例代码时,发现所有示例均通过生成随机Seed并派生密钥对来创建新账户,以此演示转账、账户信息查询等功能,示例代码如下:
Seed sd = Seed.ed25519Seed(); KeyPair coldWalletKeyPair = sd.deriveKeyPair();
通过coldWalletKeyPair.privateKey()可获取私钥,但后端持久化私钥时遇到以下问题:
- 使用Java标准序列化会抛出
NotSerializableException异常 - 控制台打印私钥会被脱敏,且源码中无直接提取私钥的直观方法
最初尝试的序列化代码及报错
尝试用Java标准序列化实现私钥持久化,代码如下:
public byte[] serializeKeyPair(PrivateKey key) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bos); os.writeObject(key); byte[] res = bos.toByteArray(); os.close(); bos.close(); return res; } Seed sd = Seed.ed25519Seed(); KeyPair coldWalletKeyPair = sd.deriveKeyPair(); byte barr[]; barr = serializeKeyPair(coldWalletKeyPair.privateKey());
执行后抛出异常:
java.io.NotSerializableException: org.xrpl.xrpl4j.crypto.keys.PrivateKey at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185) at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:349)
可行解决方案
方案1:通过UnsignedByteArray提取并还原私钥
查看xrpl4j.crypto.keys源码后,找到直接操作私钥字节数组的实现方式:
Seed sd = Seed.ed25519Seed(); KeyPair coldWalletKeyPair = sd.deriveKeyPair(); // 将私钥写入文件 UnsignedByteArray unsignedByteArr = coldWalletKeyPair.privateKey().value(); byte writeByteArr[] = unsignedByteArr.toByteArray(); FileTools.writeBytesToFile(writeByteArr, "file.bin"); // 从文件读取并还原私钥 byte readByteArr[] = FileTools.readFileToBytes("file.bin"); PrivateKey privateKey = PrivateKey.of(UnsignedByteArray.of(readByteArr));
方案2:使用Kryo序列化(由@PeterMmm提供)
借助Kryo序列化框架实现私钥的持久化,规避Java标准序列化的限制。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

