По заявлению Android хранить в Shared Preferences с private mode безопасно. Небезопасно это на рутованных устройствах, ибо там к файлу Shared Preferences можно получить доступ (без рута андройд не пускает в папку приложения).
Так что если что-то серьезное - то лучше шифровать. Как шифровать? Я бы сам хотел увидеть ответ профессионала.
У себя я сделал так: генерирую сессионны ключ AES, беру информацию, шифрую ее на сессионном ключе, результат сохраняю в приватный файл. Далее сессионный ключ шифрую на постоянном ключе RSA и сохраняю результат в файл. Сам же ключ RSA храниться в KeyStore. Почему нужен сессионный ключ? Потому что RSA может шифровать только небольшое кол-во инфы (245 байт вроде на ключе в 2048 бит).
Получается что инфа зашифрована сессионным ключом, который в свою очередь зашифрован ключе который храниться в KeyStore. Сам же KeyStore, как я понял, является аппаратным хранилищем (по крайней мере в современных устройствах) и доверять ему можно. Доступ к сохраненному ключу доступен только инстансу вашего приложения, да и то не сам ключ, а только возможность им оперировать. То есть просто так спереть инфу, без модификации вашего приложения, не получиться.
Но сейчас думаю, не сморозил ли я фигню, ибо тот же сессионный AES ключ можно было бы сохранить в KeyStore. Ну и RSA кажется лишним - это же шифрование с открытом ключем. Думал сначала хранить часть ключа на устройстве, часть на сервере с доступом по пинкоду и удалением после пару неправильных вводов, но потом решил что это лишнее...
В конце концов даже разработчики гос приложений тупо пихают конфинденциальную инфу в приватные файлы и не паряться с шифрованием, и ничего, сертификацию ФСБ проходят.