java - 我序列化 SealedObject 错了吗?
问题描述
因此,对于一个 Android 项目,我需要写入和读取 NFC 标签。当我尝试写入和读取纯文本记录时,我的 NFCReader 代码工作得很好。但是,为了使系统安全,我试图用 a 将我的对象密封在TagProfile
a中,然后将其序列化以将其写入 NFC 标签。为了读取标签,我试图反序列化然后从中获取对象。SealedObject
Cipher
SealedObject
SealedObject
TagProfile
编写代码似乎工作得很好。但是,当我尝试读取标签时,出现以下错误:java.io.StreamCorruptedException: invalid stream header: 02656EAC
我想知道我是写错了还是读错了数据。我认为它与序列化有关,而不是与加密有关。我一直在寻找这个错误,但我找不到与被抛出的相同标题的示例。我发现了这一点,但我使用 ByteArrayStreams 和 ObjectStreams 进行输入和输出。无论如何,这里是我的èncryptProfile()
anddecryptProfile()
方法,它们也执行序列化。前者在创建NdefRecord
要写入的内容时调用,后者在TagProfile
从NdefRecord
有效负载构建时调用。
private byte[] encryptProfile(TagProfile tagProfile) throws InvalidKeyException, IOException, IllegalBlockSizeException {
cipher.init(Cipher.ENCRYPT_MODE, key);
SealedObject sealedProfile = new SealedObject(tagProfile, cipher);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(sealedProfile);
oos.flush();
return bos.toByteArray();
}
...
private TagProfile decryptProfile(byte[] bytes) throws IOException, ClassNotFoundException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
SealedObject sealedObject = (SealedObject) ois.readObject();
cipher.init(Cipher.DECRYPT_MODE, key);
return (TagProfile) sealedObject.getObject(cipher);
}
当我实例化并初始化ObjectInputStream ois
at时抛出错误decryptProfile()
。Cipher
和Key
对象是全局实例化的。
编辑:我正在添加我用来写入NdefMessage
标签并从中构建的代码TagProfile
。使用纯文本可以正常工作(尽管实现方式略有不同)。
// ---------- WRITE
public void writeToTag(TagProfile profile, Tag tag) throws IOException, FormatException, IllegalBlockSizeException, InvalidKeyException, InvalidAlgorithmParameterException, NoSuchPaddingException, NoSuchAlgorithmException {
/* Plain text implementation:
NdefRecord[] records = {
createRecord(profile.id),
createRecord(profile.name),
...
};
NdefMessage message = new NdefMessage(records);
*/
NdefRecord[] encryptedRecord = {
createRecord(profile)
};
NdefMessage encryptedMessage = new NdefMessage(encryptedRecord);
Ndef ndef = Ndef.get(tag);
ndef.connect();
ndef.writeNdefMessage(encryptedMessage);
ndef.close();
}
private NdefRecord createRecord(TagProfile tagProfile) throws IOException, NoSuchPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, InvalidAlgorithmParameterException {
byte[] profileBytes = encryptProfile(tagProfile);
String lang = "en";
byte[] langBytes = lang.getBytes("US-ASCII");
int langLength = langBytes.length;
int bytesLength = profileBytes.length;
byte[] payload = new byte[1 + langLength + bytesLength];
payload[0] = (byte) langLength;
System.arraycopy(langBytes, 0, payload, 1, langLength);
System.arraycopy(profileBytes, 0, payload, 1 + langLength, bytesLength);
NdefRecord recordNFC = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], payload);
return recordNFC;
}
// ---------- READ
private TagProfile buildProfile(NdefMessage[] msgs) throws EmptyTagException, ImproperTagException{
try {
if (msgs == null || msgs.length == 0) throw new EmptyTagException();
String[] records = new String[msgs[0].getRecords().length];
if(records.length == tagLength) { // tagLength is the number of records I expect.
return decryptProfile(msgs[0].getRecords()[0].getPayload());
} else throw new ImproperTagException();
} catch (Exception e) {
e.printStackTrace();
return new TagProfile();
}
}
解决方案
推荐阅读
- html - 带白色文本的线性渐变背景
- php - 需要了解 PHP 中的 SOAP 1.2 Web 服务数据调用/发送
- pandas - 从 MacBook Pro 桌面读取 CSV 到 Pandas 数据框
- javascript - 尝试访问外部存储卡时的 ENCODING_ERR
- elasticsearch - Elasticsearch 获取所有主机值
- python - 小猪句子python翻译器
- c++ - 字符串引用(函数)的差异
- algorithm - 对对象集进行分区
- winforms - 如何回到之前的表单 C++/CLI Windows Forms
- javascript - 使用 Reactjs 在客户端通过 CIVIC 登录