android - 如何提供一种在 Android 库中使用自定义加密的方法?
问题描述
我有一个库,它具有加密它使用的东西的默认方法,这意味着用户只需要提供一个字符串作为密钥。
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,它也可以存储在加密数据中。真是一团糟。
解决方案
好像我已经搞定了。我使用了类似 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)
}
)
推荐阅读
- bigcommerce - bigcommerce 隐藏自定义地址字段
- excel - VBA 滚动到顶部(不向左)
- ios - 如何在swiftui中使用选择器内部的切换并根据切换更改选择器值
- php - 未定义的变量:laravel foreach 中的错误
- java - 有没有办法从android的firestore中的数组中获取数据
- c# - 如何使用字典
在视图(jQuery)? - laravel - 搜索后保留serach页面中的下拉值或在laravel中刷新页面
- ios - 如何知道核心数据已经完成了它的任务 swift iOS?
- intellij-idea - 如何在intellij中打开模拟器?
- php - 使用 Bootstrap 4 在我的卡片标题底部显示了额外的空白