2014-04-07 2 views
0

은폐 된 데이터의 해독에 문제가 있습니다. 스트리밍을 제대로 끝낼 수없는 것 같습니다. conceal에 문제가있는 것처럼 보이기 때문에 proxyStream (암호화 부분 만)을 전환하여 숨김을 실행하지 않기 때문에 모든 것이 예상대로 작동합니다. 나는 또한 쓰기가 괜찮다고 가정하고 예외는 없으며 디스크에 암호화 된 파일을 찾을 수 있습니다.facebook 은폐 라이브러리에 대한 문제

다른 앱이 사용자가 원할 때 해독 된 데이터를 읽을 수 있도록 contentprovider를 통해 내 데이터를 프록시 처리합니다. (공유, ...) 내 콘텐츠 제공 업체에서

내가 contentResolvers 내가 페이스 북 응용 프로그램 페이스 북 안드로이드 팀에서 추측

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 

    try { 
     ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe(); 
     String name = uri.getLastPathSegment(); 
     File file = new File(name); 
     InputStream fileContents = mStorageProxy.getDecryptInputStream(file); 
     ParcelFileDescriptor.AutoCloseOutputStream stream = new ParcelFileDescriptor.AutoCloseOutputStream(pipe[1]); 
     PipeThread pipeThread = new PipeThread(fileContents, stream); 
     pipeThread.start(); 
     return pipe[0]; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

이 표준을 사용하여 오히려이 될 수있는 데이터를 읽을 수 있도록 openFile 방법을 사용하고 있습니다 query() 바이트 배열을 가진 MediaStore.MediaColumns()으로 전송되는 방법은 나를 위해 적합하지 않습니다. 왜냐하면 나는 미디어 파일을 암호화 할뿐만 아니라 스트림의 접근법을 더 좋아하기 때문입니다.

내가 Inpustream에서 읽는 방법입니다. 이것은 기본적으로 두 개의 parcelFileDescriptors 사이의 파이프입니다. inputstream은 은폐에서 왔고 원래는 BufferedInputStream으로 래핑 된 FileInputstream입니다.

static class PipeThread extends Thread { 
    InputStream input; 
    OutputStream out; 

    PipeThread(InputStream inputStream, OutputStream out) { 
     this.input=inputStream; 
     this.out=out; 
    } 

    @Override 
    public void run() { 
      byte[] buf=new byte[1024]; 
      int len; 

      try { 
       while ((len=input.read(buf)) > 0) { 
        out.write(buf, 0, len); 
       } 

       input.close(); 
       out.flush(); 
       out.close(); 
      } 
     catch (IOException e) { 
      Log.e(getClass().getSimpleName(), 
       "Exception transferring file", e); 
     } 
    } 
} 

다른 방법으로 스트림을 읽으려고 했으므로 정말 문제가되지 않습니다.

마침내 나는 끊임없이 끝내고있다. 문제가 무엇인지 아십니까? 내가 길을 잃은 적이 있는데 기본 통화를 가리키는 ..

Exception transferring file 
com.facebook.crypto.cipher.NativeGCMCipherException: decryptFinal 
     at com.facebook.crypto.cipher.NativeGCMCipher.decryptFinal(NativeGCMCipher.java:108) 
     at com.facebook.crypto.streams.NativeGCMCipherInputStream.ensureTagValid(NativeGCMCipherInputStream.java:126) 
     at com.facebook.crypto.streams.NativeGCMCipherInputStream.read(NativeGCMCipherInputStream.java:91) 
     at com.facebook.crypto.streams.NativeGCMCipherInputStream.read(NativeGCMCipherInputStream.java:76) 

편집 : 이 스트림이 확인 작업처럼 보이지만, 무엇을 실패하면 읽는의 마지막 반복이다. 버퍼를 사용함에 따라 버퍼가 더 크면 데이터를 remaiming하는 것이 문제의 원인입니다. 나는 은폐의 근원을 조사해 왔으며, 거기에 대해서는이 점에서 괜찮은 것으로 보인다. 네이티브 레이어의 어딘가에서 실패하지 않았습니까? 참고 : 바이트의 최종 청크를 제외하고 암호 해독 된 파일을 가져 왔습니다. 따라서 예를 들어 불완전한 이미지 파일 (마지막 수천 개의 픽셀이 표시되지 않음)이 있습니다.

+1

실제로 파일을 쓰는 코드를보고 싶습니다. '동안 ((LEN = input.read (BUF))> 0) {}' 가 스트림으로부터 판독하는 올바른 방법이 아니라 '동안 ((LEN = input.read (buf))! = -1) {}'' 스트림의 마지막 반복은 파일의 무결성을 검사하기 때문에 중요하므로 무시하지 않아야합니다. – user868459

+0

이 예외는 일반적으로 작성된 파일과 읽은 파일간에 불일치가있을 때 발생합니다. 즉 실제로 파일을 변경하는 경우 또는 잘못된 파일을 읽은 경우입니다. 이것은 보안 예외이므로 storageProxy와 작성 코드의 impl에 대해 궁금합니다. – user868459

+0

사실 나는 거기서 문제를 찾고 있었지만, 슬프게도 이것은 내 문제의 근원이 아닙니다. 이전에 조언 한 코드를 사용하려고했지만 여전히 작동하지 않습니다. 나는 의심하기 시작했습니다. 내 코드가 완전히 끝났으며'ByteStreams.copy (input, out); '을 사용하려고했습니다. 동일한 예외가 있습니다 .. – simekadam

답변

4

내 작은 숨겨진 경험을 통해 파일을 암호화하는 동일한 응용 프로그램 만이 동일한 패키지가 있는지 여부에 관계없이 성공적으로 암호를 해독 할 수 있다는 것을 알았습니다. 이를 염두에 두십시오.

+0

당신은 권리. 은폐는 sharedPreferences를 사용하여 필요한 키를 저장합니다. 따라서 앱 데이터를 정리하거나 다른 기기를 사용하는 경우 해독 할 수 없습니다. –

관련 문제