相关疑难解决方法(0)

Cipher线程安全吗?

很简单,可以从多个线程中使用javax.crypto.Cipher(例如Cipher.getInstance("RSA"))一个实例,还是需要在ThreadLocal(在我的情况下)将多个实例中的多个实例中使用?

java encryption multithreading thread-safety

58
推荐指数
4
解决办法
2万
查看次数

Java AES/GCM/NoPadding - 什么是cipher.getIV()给我的?

AES/GCM/NoPadding在Java 8中使用加密,我想知道我的代码是否存在安全漏洞.我的代码似乎有效,因为它加密和解密文本,但一些细节尚不清楚.

我的主要问题是:

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] iv = cipher.getIV(); // ?????
Run Code Online (Sandbox Code Playgroud)

IV是否满足"对于给定的密钥,IV不得重复"的要求.来自RFC 4106

我也很感激我对相关问题的任何答案/见解(见下文),但第一个问题最让我烦恼.我不知道在哪里可以找到解决此问题的源代码或文档.


这是完整的代码,粗略.如果我在撰写这篇文章时引入了错误,我深表歉意:

class Encryptor {
  Key key;

  Encryptor(byte[] key) {
    if (key.length != 32) throw new IllegalArgumentException();
    this.key = new SecretKeySpec(key, "AES");
  }

  // the output is sent to users
  byte[] encrypt(byte[] src) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    byte[] iv = cipher.getIV(); // See question #1
    assert iv.length == 12; // See question …
Run Code Online (Sandbox Code Playgroud)

java security encryption cryptography aes-gcm

32
推荐指数
1
解决办法
2万
查看次数

Android - javax.crypto.AEADBadTagException

我当前在尝试解密已加密的文件时收到 AEADBadTagException。我在 stackoverflow 上搜索了几乎所有地方,但无法找到解决方案,并希望这只是我犯的一个小错误或与编码等有关,因为 GCM 无法验证它正在生成的标签。

\n\n

我相信问题出在我尝试加密/解密的文件中的某个地方。同样的代码适用于图像,但是,当我尝试加密 PDF 时,它失败并给出上述错误。

\n\n

下面的代码没有使用 CipherOutputStream/CipherInputStream,但我已经尝试过两者但没有运气。

\n\n

我知道加密/解密方法不应该这样编写,特别是对于硬编码的 IV,但现在我只是想让它工作,然后稍后正确保护这些方法。

\n\n

我正在使用 Android KeyStore 来获取我的密钥。我知道这部分是有效的,因为我在应用程序中有很多其他部分使用相同的方法使用密钥库。另外,此方法适用于图像。

\n\n

该错误发生在 cipher.doFinal(encryptedBytes) 上。当我使用 CipherInputStream 时,它发生在 CipherInputStream(EncryptedFileStream, cipher) 上

\n\n

这是代码以及错误堆栈,非常感谢任何帮助:

\n\n

加密

\n\n
        val fileBytes = inputStream.readBytes()\n        val cipher = Cipher.getInstance("AES/GCM/NoPadding")\n        keyStoreService.checkKeyAndCreate(ALIAS_FILE_KEY)\n        val key = keyStoreService.getFileKey(ALIAS_FILE_KEY)\n        val iv = byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\n        cipher.init(Cipher.ENCRYPT_MODE, key, GCMParameterSpec(128, iv))\n        val encryptedBytes = cipher.doFinal(fileBytes)\n        outputStream = FileOutputStream(file)\n        outputStream.write(encryptedBytes)\n        outputStream.flush()\n        inputStream.close()\n        outputStream.close()\n
Run Code Online (Sandbox Code Playgroud)\n\n

解密 …

encryption android cryptography aes-gcm kotlin

9
推荐指数
1
解决办法
1万
查看次数