Java Firebase加密聊天应用程序运行时错误。从快照到字符串?
我正在尝试接收字符串(消息)并对其进行加密,然后将其发送到firebase数据库。然后,当应用程序加载数据时,应向用户显示未加密的数据。因此,加密字符串位于服务器/数据库上 我收到nul指针异常,因为当您使用快照时,它似乎会调用默认消息构造函数,该构造函数不包含我调用的文本。本质上,datasnapshot调用默认构造函数,该构造函数不允许我在实际构造函数中调用对象的属性。这有什么关系吗 一旦应用程序请求将从数据库请求消息的方法,应用程序就会崩溃。在显示消息之前,我尝试从一串字节中解密消息。。。但是,这些消息将不会显示,应用程序将崩溃 这里有一个屏幕截图的链接 这是当登录成功并从数据库请求消息并显示它们时调用的方法(这一直有效,直到我搞砸了解密),我想从DB读取并解密,然后显示消息Java Firebase加密聊天应用程序运行时错误。从快照到字符串?,java,android,firebase,nullpointerexception,firebase-realtime-database,Java,Android,Firebase,Nullpointerexception,Firebase Realtime Database,我正在尝试接收字符串(消息)并对其进行加密,然后将其发送到firebase数据库。然后,当应用程序加载数据时,应向用户显示未加密的数据。因此,加密字符串位于服务器/数据库上 我收到nul指针异常,因为当您使用快照时,它似乎会调用默认消息构造函数,该构造函数不包含我调用的文本。本质上,datasnapshot调用默认构造函数,该构造函数不允许我在实际构造函数中调用对象的属性。这有什么关系吗 一旦应用程序请求将从数据库请求消息的方法,应用程序就会崩溃。在显示消息之前,我尝试从一串字节中解密消息。。。
//READ DECRYPT AND DISPLAY THE MESSAGES
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
//called when new message is inserted into the list also
//triggered for every child message
EncryptoMessage encryptoMessage =
dataSnapshot.getValue(EncryptoMessage.class);
//get the text from the encryptomessage object store as string
String encryptedString = encryptoMessage.getText(); //value of
//encryptedString ends up empty
byte [] bytes = encryptedString.getBytes();
String str = null;
try {
str = new EncryptoMessage().decrypt(bytes);
} catch (Exception e) {
e.printStackTrace();
}
EncryptoMessage decryptedMessage = new EncryptoMessage();
decryptedMessage.setText(str);
mMessageAdapter.add(decryptedMessage);
}
这是来自用户输入的消息,已加密并以字符串形式存储在数据库中。我把btye[]转换成了字符串
//SEND CLICKED
// Send button sends a message and clears the EditText && Write to the
//Database
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO: Send messages on click
//get the message the user enters
String messageText = mMessageEditText.getText().toString();
byte[] codedtext = new byte[0];
try {
//take that message and encrypt it
//codedtext now equal to byte array of messageText
codedtext = new EncryptoMessage().encrypt(messageText);
} catch (Exception e) {
e.printStackTrace();
}
//change the encrypted bytes into a string and send to the
//database
String str = new String(codedtext, StandardCharsets.UTF_8);
//Create an EncryptoMessage object for the message the user
//enters
EncryptoMessage encryptoMessage = new EncryptoMessage(str,
mUsername, null);
//add the new message object to the EncryptoChat database
mMsgDatabaseReference.push().setValue(encryptoMessage);
// Clear input box
mMessageEditText.setText("");
}
});
这是加密的消息对象类(带加密)
它并不是空的。它是空的。这是不同的。您如何知道调用了默认构造函数?在encryptoMessage.java中没有Log语句,而是有一个构造函数。firebase快照函数默认使用此EncryptoMessage构造函数。如果没有快照,则无法使用快照。但是当我请求对象上的getText()时,结果是空的,就像你说的,你需要默认的构造函数,我只是问你为什么认为它被调用了。提示:其实问题出在setter方法上,为回复老兄干杯。什么是setter方法?你能告诉我哪里出了问题吗。我已经做了几个小时了:/你能用屏幕截图或导出JSON选项显示你的Firebase数据库吗?它不会变成空的。它是空的。这是不同的。您如何知道调用了默认构造函数?在encryptoMessage.java中没有Log语句,而是有一个构造函数。firebase快照函数默认使用此EncryptoMessage构造函数。如果没有快照,则无法使用快照。但是当我请求对象上的getText()时,结果是空的,就像你说的,你需要默认的构造函数,我只是问你为什么认为它被调用了。提示:其实问题出在setter方法上,为回复老兄干杯。什么是setter方法?你能告诉我哪里出了问题吗。我已经做了好几个小时了:/你能用屏幕截图或导出JSON选项显示你的Firebase数据库吗?
package com.google.firebase.david.encryptochat; //firebase API
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
//**************************************
//THis class is our message object
//*****************************************
public class EncryptoMessage {
private String text;
private String name;
private String photoUrl;
public EncryptoMessage() {
// Default constructor required for calls to
//DataSnapshot.getValue(User.class)
}
// The encrypto message constructor to create the object
public EncryptoMessage(String text, String name, String photoUrl) {
this.text = text;
this.name = name;
this.photoUrl = photoUrl;
}
//Copy constuctor
/* public EncryptoMessage(EncryptoMessage EncryptoMessageCopy){
this(EncryptoMessageCopy.getText(), EncryptoMessageCopy.getName());
}*/
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhotoUrl() {
return photoUrl;
}
public void setPhotoUrl(String photoUrl) {
this.photoUrl = photoUrl;
}
//Encryption of the messages
public byte[] encrypt(String message) throws Exception {
final MessageDigest md = MessageDigest.getInstance("md5");
final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
.getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
final byte[] plainTextBytes = message.getBytes("utf-8");
final byte[] cipherText = cipher.doFinal(plainTextBytes);
return cipherText;
}
//Decrypt
public String decrypt(byte[] message) throws Exception {
//get the bytes if the string passing in
//byte [] bytes = message.getBytes();
final MessageDigest md = MessageDigest.getInstance("md5");
final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
.getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher decipher =
Cipher.getInstance("DESede/CBC/PKCS5Padding");
decipher.init(Cipher.DECRYPT_MODE, key, iv);
final byte[] plainText = decipher.doFinal(message);
return new String(plainText, "UTF-8");
}
FATAL EXCEPTION: main
Process: com.google.firebase.david.encryptochat, PID: 8733
java.lang.NullPointerException: Attempt to invoke virtual method 'byte[] java.lang.String.getBytes()' on a null object reference
at com.google.firebase.david.encryptochat.MainActivity$4.onChildAdded(MainActivity.java:238)