如何在ImageView中加载Cipher加密的图像文件而不保存到设备

我正在创建一个具有内容安全性的应用程序,因为没有人可以复制内容和文件。 我使用密码直接从URL加密图像,而不是下载到设备。 请在下面find我的代码。

URL url = new URL(images.getImageurl()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); File folder = new File(Environment.getExternalStorageDirectory(), "zerb"); boolean success = true; if (!folder.exists()){ folder.mkdirs(); } InputStream fis = connection.getInputStream(); String path = folder.getAbsolutePath() + "images.getImageName + ".jpg"; encryptfile(fis, path, AppConstants.password + images.getContentid() + images.getTopicid()) fis.close(); 

密码加密方法代码是

 private static boolean encryptfile(InputStream inputStream, String path, String password) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { FileOutputStream fos = new FileOutputStream(path.concat(".crypt")); byte[] key = (AppConstants.salt + password).getBytes("UTF-8"); MessageDigest sha = MessageDigest.getInstance("SHA-1"); key = sha.digest(key); key = Arrays.copyOf(key, 16); SecretKeySpec sks = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sks); CipherOutputStream cos = new CipherOutputStream(fos, cipher); int b; byte[] d = new byte[8]; while ((b = inputStream.read(d)) != -1) { cos.write(d, 0, b); } cos.flush(); cos.close(); inputStream.close(); File encryptedFile = new File(path.concat(".crypt")); return (encryptedFile.exists()); } 

并且解密代码是

  public static void decrypt(String path, String password, String outPath) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { FileInputStream fis = new FileInputStream(path); FileOutputStream fos = new FileOutputStream(outPath); byte[] key = (AppConstants.salt + password).getBytes("UTF-8"); MessageDigest sha = MessageDigest.getInstance("SHA-1"); key = sha.digest(key); key = Arrays.copyOf(key, 16); SecretKeySpec sks = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sks); CipherInputStream cis = new CipherInputStream(fis, cipher); int b; byte[] d = new byte[8]; while ((b = cis.read(d)) != -1) { fos.write(d, 0, b); } fos.flush(); fos.close(); cis.close(); } 

如果我解密图像,它将被显示并可以从设备复制。 我只需要将加密的图像加载到ImageView而不将解密的图像保存到设备,这样就没有人可以复制了。 请有人帮帮我

ImageView可以显示内存中的android.graphics.Bitmap ,可以直接从InputStream读取。

例如, decrypt()方法可以适用于返回Bitmap

 public Bitmap decrypt(String path, String password) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { FileInputStream fis = new FileInputStream(path); byte[] key = (AppConstants.salt + password).getBytes("UTF-8"); MessageDigest sha = MessageDigest.getInstance("SHA-1"); key = sha.digest(key); key = Arrays.copyOf(key, 16); SecretKeySpec sks = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sks); CipherInputStream cis = new CipherInputStream(fis, cipher); Bitmap bitmap = BitmapFactory.decodeStream(cis); cis.close(); return bitmap; } 

(虽然它叫做Bitmap ,但解码.jpg.png很好)。

然后这可以在ImageView

 ImageView imageView = findViewById(R.id.imageView); Bitmap bitmap = decrypt(path + ".crypt", password); imageView.setImageBitmap(bitmap);