Cách lưu thông tin bảo mật trong Android
Mình có 1 số gợi ý để tăng tính bảo mật trong việc lưu trữ trong Android, bạn có thể cần chú ý các điểm sau :
- Hạn chế tối thiểu việc truyền biến lưu trữ thông tin nhạy cảm giữa các function, service mà không qua mã hóa. Một ví dụ về phương thức tấn công theo dạng này là code reuse attacks
- Hạn chế request các permission không cần thiết
- Lưu trữ thông tin dưới local khi đã mã hóa
Nói tóm lại là cần mã hóa dữ liệu trước khi gửi/ lưu/ chia sẻ dữ liệu. Dưới dây là một số mã hóa thông dụng:
- Cách cây nhà lá vườn là dùng các loại hash đơn giản như MD5 để encrypt chuỗi. Cách này thích hợp cho việc lưu trữ nhanh các chuỗi , đơn giản, dễ hiểu
- Cách hơi lập dị: lưu xuống file trong internal storage với mode
MODE_PRIVATE
. Theo lý thuyết thì các data này sẽ chặn các ứng dụng khác đọc nó. Nhưng mình thấy cách này khá vô dụng, vì mình vẫn có thể lấy được data dạng này nếu muốn - Đối với loại database truyền thống như SQLLite, bạn có thể dùng kèm với SQLCipher để mã hóa data khi lưu. Nói dễ hiểu là bạn đưa nó 1 cái key, nó sẽ encrypt db cho bạn, muốn đọc db lên được phải đưa đúng key cho nó. Vấn đề thú vị ở đây là bạn sẽ lưu cái key đó ở đâu cho an toàn , ở đây mình có biết một số mô hình thông dụng:
- Lưu hard-code cái key đó trong share preference hoặc chỗ nào khó tìm trong project (cách củ chuối)
- Yêu cầu user nhập passcode hoặc mã PIN, dùng mã PIN của user làm key
- Lưu key và database trên server, user chỉ có thể truy cập thông tin qua các request gửi tới server (cách này không phù hợp với câu hỏi của bạn)
- Đối với ORM database như GreenDAO, Realm đều có hỗ trợ việc crypto db, bạn có thể tìm hiểu thử
- Dùng KeyStore của Android. Đây là 1 phương thức mã hóa mà Android cung cấp sẵn, tuy nhiên với các thuật toán phức tạp hơn thôi. Bạn có thể tìm hiểu nếu thích.
Tuy nhiên nên lưu ý việc encrypt data luôn đi kèm với viêc giảm performance, quá trình đọc ghi sẽ chậm hơn rất nhiều, tùy vào mục đích cụ thể mà dùng. Mà an toàn nhất là đừng lưu dưới local
Hiển thị TextView kiểu số trong Android
Nếu bạn chỉ muốn format String thông thường thì có dùng các hàm cắt, cộng chuỗi trong java.
Còn nếu bạn muốn tự động chuyển sang dấu sao khi người dùng nhập số thì có thể dùng cách này :
Viết 1 class custom lại PasswordTransformationMethod
, số 9
trong hàm charAt
chính là số kí tự bạn muốn chuyển sang dấu *
.
public class MyTransformationMethod extends PasswordTransformationMethod {
@Override
public CharSequence getTransformation(CharSequence source, View view) {
return new CustomCharSequence(source);
}
private class CustomCharSequence implements CharSequence {
private CharSequence mSource;
CustomCharSequence(CharSequence source) {
mSource = source;
}
@Override
public char charAt(int index) {
return (index < 9) ? '*' : mSource.charAt(index);
}
@Override
public int length() {
return mSource.length();
}
@Override
public CharSequence subSequence(int start, int end) {
return mSource.subSequence(start, end);
}
}
}
Và trong code, chỉ cần set thuộc tính của editText như sau:
editText.setTransformationMethod(new MyTransformationMethod());
Xóa Cookie trong android
Bạn có thể cung cấp rõ thêm version hệ điều hành máy mà bạn test và trình duyệt trên máy của bạn (chrome , firefox,...) được không? Lỗi này mình đoán có thể do:
- File build apk của bạn bị lỗi (cần rebuild lại thử xem sao) vì mình thấy có liên quan đến file dex
on path: DexPathList
- Chromium có vấn đề, vì webview trên một số máy Android nếu không support chromium có khả năng gây ra lỗi
Ngoài ra, CookieSyncManager đã bị deprecated, quá trình sync cookie đã được android làm tự động từ API >= 22, bạn nên viết lại đoạn code trên như sau:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
CookieManager.getInstance().removeAllCookies(null)
CookieManager.getInstance().flush()
} else {
val cookieSyncMngr = CookieSyncManager.createInstance(context)
cookieSyncMngr.startSync()
val cookieManager = CookieManager.getInstance()
cookieManager.removeAllCookie()
cookieManager.removeSessionCookie()
cookieSyncMngr.stopSync()
cookieSyncMngr.sync()
}
set status bar background as gradien Android
Gọi hàm này trước khi setContentView , cách này chỉ hoạt động khi API > 21
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static void setStatusBarGradiant(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
Drawable background = activity.getResources().getDrawable(R.drawable.gradient_theme);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(activity.getResources().getColor(android.R.color.transparent));
window.setNavigationBarColor(activity.getResources().getColor(android.R.color.transparent));
window.setBackgroundDrawable(background);
}
}
Tổ chức
Chưa có tổ chức nào.