최악의 상황의 로직을 그려보았습니다.
오토마타 수업이 생각나네요 -_-;
1.사용자가 1234로 암호를 설정한다.
2. 암호 메모를 작성하면 1234(메모내용); 로 암호화가 된다.
3. 암호자체의 암호 AES(1234) 가 db 에 저장된다.
4. 루팅사용자가 암호 db를 삭제한다.
5. 암호 글을 읽으려고 하면 기존 암호 db가 삭제된걸 알고 어쩔 수 없이 암호 설정 액티비티에서 암호를 새로 만든다.
6. 그 새로 만든 암호가1234가 아닌 asdf 일경우 기존 암호화 메모는 복호화 되지 못한다.
해결방법1. sqlite안에 암호글을 넣을때는 내용을 encrypt 하지 않는다. -> 보안 부분 우려
해결방법2. 메모내용을 사용자 암호로 encrypt 하지 않고 내부 암호를 사용한다 -> 디컴파일시 알고리즘 파괴
아이디어좀...굽신굽신...
해결책은 아니지만 보안적인 측면에서의 문제를 적어보자면...
1. 지금 저 내용대로라면
ciphertext는 E(plaintext, pwd)형태로 저장되는거고
암호의 encrypt된 내용은 AES(pwd, key)라는거죠? 저기서 메모 내용을 암호화 하는 알고리즘은 뭔가요? 암호화-복호화 과정이 있어야되니 분명 이는 one-way-function이 아닐꺼고 사실 가장 많이 쓰이는 방식을 생각하면 AES나 DES일껀데 이 키는 누가 어디서 발급하나요. 설마 키 자체가 어플 자체에 하나만으로 설정하진 않으실텐데.... 그 경우에 side-channel attack에 심각하게 무기력하다고 생각됩니다.
2. 서버에 백업 DB가 있으면 아마도 이 문제를 해결할 수 있지 않나 생각합니다. 최초 암호 생성시에 디바이스와 서버에 각각 db를 저장하고 디바이스에서 암호가 없다고 하면 서버를 참조해서 그 디비를 재발급형식으로 받아오거나 하면 되지않을까요....
암호를 사용자가 입력하게 하는 것이 어떨까요?
그러면 암호 데이터가 사라졌을때 다시 입력하라고 할수 있으니까요~!