【发布时间】:2019-01-15 20:36:59
【问题描述】:
我正在尝试加密来自 android 的消息,然后在网络中解密。
首先,我使用 Javascript 生成一个密钥并将其存储在我的数据库中
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for( var i=0; i <10; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
secondaryDatabase.ref().update({
[displayName]:text
})
其次,我在 Java 中通过检索输入字段中的消息和数据库中的密钥来加密消息。
message.setText(message);
String key = String.valueOf(dataSnapshot);
encryptedI = AESCrypt.encrypt(key,message);
为了简单起见,让我们假设消息是“hello world”,密钥是密码
String message = "hello world";
String key = "password";
encryptedI = AESCrypt.encrypt(key,message);
第三,我将加密的消息存储在数据库中。
mRef.child(uid).child("encryptedmessage").setValue(encryptedI);
最后,我使用 javascript 上的 Cryto-js 从数据库中检索到的密钥解密了消息,但它返回一个空字符串
var decrypted = CryptoJS.AES.decrypt(message,key);
var decryptedvalue=decrypted.toString(CryptoJS.enc.Utf8)
我检查了使用的密钥和加密消息是否相同,我什至用 Java 解密以确保加密正确完成。 我在 Android 中使用https://github.com/scottyab/AESCrypt-Android 进行加密 而 cryto-js 用于在 javascript 中解密
问题是为什么它返回一个空字符串,我该如何解决它。
【问题讨论】:
-
这是一种可怕的密钥派生方法,使用 PBKDF2 aka Rfc2898 和方法有时命名为:
Rfc2898DeriveBytes。 -
只是一个奇怪的问题。由于我计划将密钥存储在数据库中,所以我使用 Rfc2898DeriveByte 还是随机生成的字符是否重要?因为如果“黑客”设法以某种方式进入数据库,他们将能够以任何一种方式获得密钥。对不起,如果我错了,我还在努力理解密码学,这对我来说是一个相当复杂的话题。
标签: javascript encryption cryptography