如何提供一种在 Android 库中使用自定义加密的方法?

Posted

技术标签:

【中文标题】如何提供一种在 Android 库中使用自定义加密的方法?【英文标题】:How to provide a way to use custom encryption in Android library? 【发布时间】:2021-11-11 15:33:37 【问题描述】:

我有一个库,它有默认方式来加密它使用的东西,这意味着用户只需要提供一个字符串作为密钥。

lib.encryption("key")
lib.doEncryptedStuff() // use default encryption

我希望允许用户使用自定义加密,包括那些实现自定义 java 加密提供程序的用户。我的问题是,向用户询问此类加密方法的正确方法应该是什么?现在我想到了请求两个密码 - 一个用于加密,一个用于解密。

// create and init() ciphers here
lib.encryption(cipherEncrypt, cipherDecrypt)
lib.doEncryptedStuff() // use custom ciphers

但我不确定这是否是正确的方法。密码够用吗?或者我应该为用户提供加密接口来实现?我记得重用 IV 存在问题,这意味着密码重新初始化?

我面临的另一个问题是我很难概括界面。就像带有 ECB 的 AES 将使用 encrypt()/decrypt() 方法一样,但是对于 CBC,它需要 IV,它也可以存储在加密数据中。真是一团糟。

【问题讨论】:

很抱歉我不能直接帮助您,但我有义务让您知道这篇文章:crypto.stackexchange.com/questions/43272/… 这是基本安全 101,您不想创建自己的加密。就放在这里吧。用这些信息做你想要的:) @muetzenflo 感谢您的回复!但是“自定义”加密是指默认情况下不包含在 Java 库中的标准化加密。像俄罗斯的 Kuznyechik 通过 Cryptopro 库。它作为库添加到 android 应用程序中,我们需要支持在需要时在我们的库中使用这些加密库。或者,例如,如果使用库的组织需要 AES 以外的东西。 我们谈论的是 JVM (Java/Kotlin) 库还是 C 库? 【参考方案1】:

看来我已经搞定了。我使用了类似 Stream 的方法,但不依赖于流。它允许通过将接口作为参数传递来使用用户需要的任何加密。

我的界面:

interface Encryption

  fun encrypt(
    read:  (buffer: ByteArray, count: Int) -> Int,
    write: (buffer: ByteArray, count: Int) -> Unit
  )

  fun decrypt(
    read:  (buffer: ByteArray, count: Int) -> Int,
    write: (buffer: ByteArray, count: Int) -> Unit
  )

示例实现:

// init cipher and buffer
val cipher = Cipher.getInstance(MODE)
val buffer = ByteArray(BLOCK_SIZE)
cipher.init(Cipher.ENCRYPT_MODE, keystore.getKey(KEY_ALIAS, null))

// write iv (when decrypting read IV from beginning)
val iv = cipher.iv
write(iv, iv.size)

// write data
var count = 0
while (true)

  count = read(buffer, BLOCK_SIZE)

  if (count < BLOCK_SIZE)
    break

  val encrypted = cipher.update(buffer, 0, count)
  write(encrypted, encrypted.size)


// flush remains
if (count > 0)

  val final = cipher.doFinal(buffer, 0, count)
  write(final, final.size)

示例用法(输入和输出是流):

encryption.encrypt(
  read =  buffer, count ->
    input.read(buffer, 0, count)
  ,
  write =  buffer, count ->
    output.write(buffer, 0, count)
  
)

【讨论】:

以上是关于如何提供一种在 Android 库中使用自定义加密的方法?的主要内容,如果未能解决你的问题,请参考以下文章

MFC 是不是提供了一种在剪贴板上快速放置文本的方法?

ZF2 Doctrine - 使用查询构建器如何指向存储库中的自定义方法

如何使用自定义字段制作 PayPal 加密的“立即购买”按钮?

如何制作 Android 自组件并从 jar 库中使用它?

Android - 如何从相机捕获图像或从库中添加

Flutter 之 自定义路由切换动画