- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谷歌介绍security-crypto jetpack library
我想用这个库来加密图像文件,在库的文档中没有图像文件加密的示例。
我将图像转换为位图 - 位图到字节数组 - 然后使用库 如文档中所述finaly文件是加密的,但是文件解码的时候出现黑图我没有得到任何异常,问题出在哪里?
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView =findViewById(R.id.image);
// get image from asset and convert to bitmap
Bitmap bitmap = getBitmapFromAsset(this,"temp.jpg");
byte[] bytesOfBitmap= BitmapToByteArray(bitmap);
// encrypt
File pathForSaveEncryptedFile=new File(getFilesDir().getAbsolutePath() + File.separator+"encrypted.me");
try {
encryptToFile(this,pathForSaveEncryptedFile,bytesOfBitmap);
} catch (GeneralSecurityException | IOException e) {
e.printStackTrace();
}
// decrypt and show to image view
try {
byte[] decryptedFile = decryptFile(this,pathForSaveEncryptedFile);
imageView.setImageBitmap(ByteArrayToBitmap(decryptedFile));
} catch (GeneralSecurityException | IOException e) {
e.printStackTrace();
}
}
private void encryptToFile(Context context,File pathToSave,byte[] contents) throws GeneralSecurityException, IOException {
MasterKey mainKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
EncryptedFile encryptedFile = new EncryptedFile.Builder(context,
pathToSave,
mainKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build();
OutputStream outputStream = encryptedFile.openFileOutput();
outputStream.write(contents);
outputStream.flush();
outputStream.close();
}
private byte[] decryptFile(Context context ,File target) throws GeneralSecurityException, IOException {
MasterKey mainKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
EncryptedFile encryptedFile = new EncryptedFile.Builder(context,
target,
mainKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build();
InputStream inputStream = encryptedFile.openFileInput();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int nextByte = inputStream.read();
while (nextByte != -1) {
byteArrayOutputStream.write(nextByte);
nextByte = inputStream.read();
}
return byteArrayOutputStream.toByteArray();
}
private byte[] BitmapToByteArray(Bitmap bitmap){
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
return stream.toByteArray();
}
private Bitmap ByteArrayToBitmap(byte[] bytes){
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
private Bitmap getBitmapFromAsset(Context context, String fileName) {
AssetManager assetManager = context.getAssets();
InputStream istr;
Bitmap bitmap = null;
try {
istr = assetManager.open(fileName);
bitmap = BitmapFactory.decodeStream(istr);
} catch (IOException e) {
// handle exception
}
return bitmap;
}
我也将图像转换为 base64(String) 并使用了库但不起作用。
最佳答案
您有两种加密/解密位图的方法。
使用 EncryptedFile 提供的流。完全不需要使用 Base64 编码/解码。
加密:
private void encrypt(final Context context, final File target, final Bitmap bitmap) throws GeneralSecurityException, IOException {
final MasterKey mainKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
final EncryptedFile file = new EncryptedFile.Builder(context,
target, mainKey, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB)
.build();
final OutputStream stream = file.openFileOutput();
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream);
stream.flush();
stream.close();
}
解密:
private Bitmap decrypt(final Context context, final File target) throws GeneralSecurityException, IOException {
final MasterKey mainKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
final EncryptedFile file = new EncryptedFile.Builder(context,
target, mainKey, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB)
.build();
final InputStream stream = file.openFileInput();
return BitmapFactory.decodeStream(stream);
}
对于您的特定代码示例,请执行以下操作:
private byte[] bitmapToByteArray(final Bitmap bitmap) {
final ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
final String data = Base64.encodeToString(stream.toByteArray(), Base64.DEFAULT);
return data.getBytes();
}
private Bitmap byteArrayToBitmap(final byte[] bytes) {
final byte[] data = Base64.decode(bytes, Base64.DEFAULT);
return BitmapFactory.decodeByteArray(data, 0, data.length);
}
关于android - 使用 Jetpack EncryptedFile 安全性进行图像加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64329635/
有没有一种简单的方法可以在 compose 中删除开关的内部填充? 我尝试在其修饰符中提供 0.dp,但它并没有摆脱内部填充 Switch( modifier = Modifier
我正在使用底部导航栏,每个菜单都会将用户导航到特定的可组合屏幕。我使用导航库来管理它们之间的导航。 我为所有可组合项使用一个通用的 ViewModel。我在其中一个可组合项中使用惰性列,当我通过单击底
我在撰写屏幕中有一个 TextField 和一个 ModalDrawer。我想在用户打开抽屉时关闭软键盘,但我一直无法弄清楚如何。在 ModalDrawer afaik 中没有触发 onOpened
我一直在搜索文档,但找不到确认。有谁知道navigation和 compose来自 Android Jetpack 的组件彼此兼容吗? 我知道Jetpack Compose尚未准备好生产,仅处于开发人
我正在尝试将我的应用程序更新为新的撰写版本,但它给了我一个我不知道如何修复的错误。当我运行时,错误仍然存在于我的运行中。我的旧项目正常工作,但我想要的是更改版本,如果有人可以帮助我,我将不胜感激
我有这样的用户界面: val scrollState = rememberScrollState() Column( modifier = Modifier
有没有办法在 Compose 中的列表(列/行)更改上获得动画效果,看起来类似于带有 setItemAnimator 的 recyclerview 动画? 最佳答案 目前没有办法用 LazyColum
我想隐藏状态栏,我已经使用伴奏库做到了这一点: val systemUiController = rememberSystemUiController() systemUiController.isS
我想隐藏状态栏,我已经使用伴奏库做到了这一点: val systemUiController = rememberSystemUiController() systemUiController.isS
使用 Android View,我可以像这样将焦点移动到 View: fun View.requestAccessibilityFocus() { requestFocus() sen
我正在尝试在我的 Android 应用程序中使用 Jetpack Compose 播放视频。要使用 ExoPlayer 进行流式传输,但我真的不明白如何实现全屏按钮,有什么建议吗? @Composab
通常可以使用修饰符将不同的形状分配给可组合项,但在此可组合项中没有这样做。 我希望图像中标记的部分是一个圆圈 你可以在下面看到我写的代码 @Composable fun StandardCheckbo
Jetpack compose 提供了很多 Material 组件,如 TextField 等。 然而,要构建类似文件编辑器的东西,可以使用什么样的组件来支持多行文本任意长的文本操作,如选择文本、剪切
我们可以使用 Scaffold 在 JetpackCompose 中使用抽屉导航如下 Scaffold( drawerContent = { Text(text ="Drawer") } )
对不起,我几乎不会说英语。 机器翻译: 如何为 Jetpack Compose 设置阴影颜色? 我可以设置阴影,但它们很难看。 Jetpack Compose 代码: Surface( mod
我正在开发一个小型 jetpack-compose 演示聊天应用程序。所以我需要在底部有一个带有 TextField 和一个要发送的按钮的栏,就像在 WhatsApp 中一样......我认为最好使用
我正在 Jetpack Compose Desktop 中创建一个应用程序,它将接受用户输入,在用户重新打开应用程序后,输入值应该在那里。我的意思是,在用户重新打开应用程序后,用户给定的数据应该在那里
描述 在 SnackbarHostState 上调用 showSnackbar 并传递 duration 参数不会关闭 Snackbar。协程似乎无限期暂停。 重现步骤: val snackbarHo
谁能建议如何在 Jetpack Compose Navigation 的不同部分共享 ViewModel? 根据文档,viewModels 通常应该在使用事件范围的不同组合函数中共享,但如果在导航内部
我想在相机预览上方创建一个半透明图层,如下所示: 我在我的应用程序中完成了相机预览,我想要的只是在预览上有一个半透明的图层,带有剪裁的卡片形状,如图所示(带有圆角)。 所以:全屏相机预览,上面有一个全
我是一名优秀的程序员,十分优秀!