Javascript 解密返回空字符串

Javascript 解密返回空字符串,javascript,encryption,cryptography,Javascript,Encryption,Cryptography,我正在尝试加密来自android的消息,然后在web上解密它 首先,我使用Javascript生成一个密钥并将其存储在数据库中 var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for( var i=0; i <10; i++ ) text += possible.charAt(Math.floor(Math.random() * poss

我正在尝试加密来自android的消息,然后在web上解密它

首先,我使用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
})
为了简单起见,我们假设消息是“hello world”,密钥是密码

String message = "hello world";
String key = "password";
encryptedI = AESCrypt.encrypt(key,message);
第三,我将加密消息存储在数据库中

message.setText(message);
String key = String.valueOf(dataSnapshot);
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解密以确保加密正确完成。 我用安卓系统加密 而cryto js在javascript中进行解密


问题是它为什么返回空字符串,我如何解决它。

您不能只将两个不同的库放在一起,希望它们能够兼容。虽然AES本身已经被标准化,但它仅被标准化为具有三种可能密钥大小的分组密码:AES-128、AES-192和AES-256。要真正加密某些东西,您需要一种操作模式,可能还需要填充。如果要使用密码而不是密钥,则需要从密码派生密钥,例如使用PBKDF2


由于您提到的两个库都很弱,而且指定得很糟糕,我强烈建议您为Java和JavaScript找到两个兼容的基于密码的加密库

应该可以使用Crypto JS和Android执行PBKDF2。不过,我不会使用独立的加密库,只是使用Android已经提供的功能。不要忘记实现一个高迭代计数,并确保使用的密码达到标准。如果您想要任何类型的安全性,您可以使用经过身份验证的加密,或者自己使用HMAC-SHA256或类似工具来实现


因为我不知道您的用例或威胁模型(我也不打算这么做),所以只将其视为正确方向的一般提示,而不是可靠的安全建议。

这是一种可怕的密钥派生方法,请使用PBKDF2 aka Rfc2898和有时命名为:
Rfc2898DeriveBytes
的方法。这只是一个奇怪的问题。由于种种原因,我计划将密钥存储在数据库中,我使用的是Rfc2898DeriveByte还是随机生成的字符,这有关系吗?因为如果“黑客”设法进入数据库,他们将能够以任何方式获得密钥。对不起,如果我错了,我还在努力理解密码学,这对我来说是一个相当复杂的话题。对不起,我不知道有这么大的问题。我是加密新手,所以我只是想通过组合不同的示例来实现一些功能。关于密钥,它只是一个随机生成的字符作为密钥,而不是用户的密码。我看到许多示例使用crypto js,所以我认为这是一个很好的库。您对包含示例且可能不太复杂的库有什么建议吗?“我不熟悉密码,所以我只是尝试通过将不同的示例组合在一起来实现某些功能。”这不是一个好主意;也许你会找到工作,但你知道它有多安全吗?“关于密钥,它只是一个随机生成的字符作为密钥,而不是用户的密码。”密钥应该由对手的完全随机字节组成,而不是字符。“我看到很多例子使用crypto js,所以我认为这是一个很好的库。”不幸的是,好的加密不是由大众投票决定的。对于这种加密,使用TLS几乎总是更好的。创建传输安全性有太多的陷阱,这似乎是您所需要的。哦,我实际上在我的网站上实现了SSL(Cloudfare),不确定这是否是您的意思。在我的项目中有一部分,用户必须在应用程序中提交他们的银行号,以便另一方进行交易。据我所知,我们不应该在数据库中存储用户的敏感数据。因此,我考虑对它进行加密并将其存储到数据库中,当另一方需要它时,他们可以通过web访问它(这就是解密的目的)。由于这不完全是一个支付的事情,我不能使用第三方支付页面,因为它不是我需要的。我已经添加了一些更多的信息。但在这方面你似乎需要专家的帮助。即使银行账号不是最大的秘密,它仍然是非常敏感的,特别是当你也使用它进行交易时。