【问题标题】:Decryption returns empty string解密返回空字符串
【发布时间】: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


【解决方案1】:

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


由于您提到的这两个库都很弱且指定错误,我强烈建议您找到两个兼容的基于密码的 Java 和 JavaScript 加密库。

应该可以同时使用 Crypto-JS 和 Android 来执行 PBKDF2。不过,我不会使用独立的加密库,只需使用 Android 已经提供的功能即可。不要忘记实现高迭代次数并确保使用的密码符合标准。如果您需要任何类型的安全性,您可以使用经过身份验证的加密或使用 HMAC-SHA256 或类似方法自行实现。

由于我不了解您的用例或威胁模型(而且我不打算),因此仅将其视为正确方向的一般提示,而不是可靠的安全建议。

【讨论】:

  • 很抱歉,我不知道有这么大的问题。我是密码学的新手,所以我只是想通过将不同的示例组合在一起来使某些东西起作用。关于密钥,它只是一个随机生成的字符来充当密钥,而不是用户的密码。我看到很多例子都使用了 crypto-js,所以我认为它是一个很好的库。您是否有任何包含示例且可能不那么复杂的建议库?
  • “我是密码学新手,所以我只是想通过将不同的示例组合在一起来使某些东西起作用。”这不是一个好主意;也许你会得到一些工作,但你知道它有多安全吗? “关于密钥,它只是一个随机生成的字符来充当密钥,而不是用户的密码。”密钥应该由对手的完全随机字节组成,而不是字符。 “我看到很多例子都使用了 crypto-js,所以我认为它是一个很好的库。”不幸的是,好的加密货币不是由民众投票决定的。
  • 对于这种加密技术,使用 TLS 几乎总是更好。创建传输安全性的陷阱太多了,而这似乎正是您所需要的。
  • 哦,我实际上已经在我的网站上实现了 SSL(Cloudfare),不知道这是否是您的意思。在我的项目中有一部分,用户必须在应用程序中提交他们的银行号码,以便对方进行交易。据我所知,我们不应该将用户的敏感数据存储在数据库中。因此,我正在考虑对其进行加密并将其存储在数据库中,当对方需要它时,他们可以简单地通过网络访问它(这就是解密的来源)。由于它不完全是付款的东西,我不能使用第 3 方付款页面,因为它不是我需要的。
  • 我添加了更多信息。但似乎您需要专家的帮助。即使银行帐号不是最大的秘密,它仍然非常敏感尤其是如果您还使用它进行交易。
猜你喜欢
  • 2019-12-27
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2021-02-11
相关资源
最近更新 更多