【Android安全】自带加密光环的SharedPreference

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

项目地址:https://github.com/afinal/SecuritySharedPreference

前言

安全问题长久以来就是Android系统的一大弊病,很多人也因此舍弃Android选择了苹果,作为一个Android Developer,我们需要对用户的隐私负责,需要对用户的数据安全倾尽全力,想到这里,我就热血沸腾,仿佛自己化身正义的天使(我编不下去了。。。)。

概述

现在,我们回归正题,SharedPreference是我们比较常用的保存数据到本地的方式,我们习惯在SharedPreference中保存用户信息,用户偏好设置,以及记住用户名密码等等。但是,SharedPreference存在一些安全隐患,我们都知道,SharedPreference是以“键值对”的形式把数据保存在data/data/packageName/shared_prefs文件夹中的xml文件中。
在正常的情况下,我们没办法访问data/data目录,我们也没办法拿到xml中的文件。但是,我们root手机之后,通过命令行可以获得读写data/data目录的权限,我们SharedPreference中保存的数据也就很容易泄漏,造成不可挽回的损失。那么我们今天就从SharedPreference开刀,为APP的安全尽一份绵薄之力。

代码

SecuritySharedPreference.java

我们实现了SharedPreference接口和SharedPreference.Editor接口,重写了保存数据和取出数据的方法,我们在保存数据和取出数据的时候加了加解密层,这样可以保证我们在操作自定义的SharedPreference时候像调用原生的一样简单。

package com.domain.securitysharedpreference;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 自动加密SharedPreference
 * Created by Max on 2016/11/23.
 */

public class SecuritySharedPreference implements SharedPreferences {
   
   

    private SharedPreferences mSharedPreferences;
    private static final String TAG = SecuritySharedPreference.class.getName();
    private Context mContext;

    /**
     * constructor
     * @param context should be ApplicationContext not activity
     * @param name file name
     * @param mode context mode
     */
    public SecuritySharedPreference(Context context, String name, int mode){
        mContext = context;
        if (TextUtils.isEmpty(name)){
            mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        } else {
            mSharedPreferences =  context.getSharedPreferences(name, mode);
        }

    }

    @Override
    public Map<String, String> getAll() {
        final Map<String, ?> encryptMap = mSharedPreferences.getAll();
        final Map<String, String> decryptMap = new HashMap<>();
        for (Map.Entry<String, ?> entry : encryptMap.entrySet()){
            Object cipherText = entry.getValue();
            if (cipherText != null){
                decryptMap.put(entry.getKey(), entry.getValue().toString());
            }
        }
        return decryptMap;
    }

    /**
     * encrypt function
     * @return cipherText base64
     */
    private String encryptPreference(String plainText){
        return EncryptUtil.getInstance(mContext).encrypt(plainText);
    }

    /**
     * decrypt function
     * @return plainText
     */
    private String decryptPreference(String cipherText){
        return EncryptUtil.getInstance(mContext).decrypt(cipherText);
    }

    @Nullable
    @Override
    public String getString(String key, String defValue) {
        final String encryptValue = mSharedPreferences.getString(encryptPreference(key), null);
        return encryptValue == null ? defValue : decryptPreference(encryptValue);
    }

    @Nullable
    @Override
    public Set<String> getStringSet(String key, Set<String> defValues) {
        final Set<String> encryptSet = m
Android入门第52天-在SharedPreference中使用加密 在上一篇中,我们讲了SharedPreference的使用。但是那不是一个生产场景。特别是我们举了一个例子,存放登录信息的例子。这个例子里用户的密码没有加密,比如说在真实的实际生产环境里用户的一些敏感信息或者说是像:用户四要素按照等保3规范以及“个信”法,都是需要加密和脱敏的。所以当碰到这样的“敏感”信息脱敏需求时,我们不可以直接把一个明文存入SharedPreference。因此我们今天会使用MD5来对SharedPreference中存放的信息进行脱敏处理。 阅读详情

相关推荐

Android入门第51天-使用AndroidSharedPreference存取信息

上一篇我们介绍了在android里如何读写本地文件。我们有一种场景,类似网页的cookie,要把用户的一些储如上一次登录、使用的痕迹等信息保存下来以便于每次不需要做重复“填表单”的操作,当在这种场景下我们如果也使用本地文件读写的话显然是“太重”了。因此android提供了一种轻量级存储叫SharedPreference专门用来存储这种场景下的数据。

打造全国最全的AI Agent开发知识领域的博客 1393

CryptSharedPreference:在SharedPreference util中加密的保存类

CryptSharedPreference 1、介绍 SharedPreferences中封装了一系列使用sp保存数据的方法,特点在于可以直接保存数据类与储存时加密数据。 2、如何依赖 step 1: 在项目根目录下的build.gradle添加 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } step 2: 添加项目依赖 dependencies { implementation 'com.github.YeGuli:CryptSharedPreference:v1.0.0' } 3、如何使用 创建继承自BaseSet的数据类: public class AccountSet extends BaseSet { private String u

Android-一个比较安全SharedPreference加密方案

一个比较安全SharedPreference加密方案

06 Anykey用户数据的存储和加载SecuritySharedPreference

目录预先准备 1 先看一下最终效果图 2 确认默认启动界面仍是登录界面 3 创建LogUtiljava用来记录日志 4 添加以下依赖库 使用SecuritySharedPreference完成登录的加解密过程 1 配置SecuritySharedPreference 2 LoginActivity重制 填表数据的绑定和加载 1 右分页布局 2 保存用户数据 21 点击保存按钮时的业务 22 保存卡片

Likianta 的博客 1292

【工具类】Android数据存储sharedpreferences加密

//配合上一篇【工具类】AES加密和解密,实现sharedpreferences保存数据进行AES加密; import java.util.List; import java.util.Map; import android.content.Context; import android.content.SharedPreferences; /** * 存储配置信息的工具

CSDN博客 2703

推荐开源项目:SecuritySharedPreference - 安全Android SharedPreferences实现

推荐开源项目:SecuritySharedPreference - 安全Android SharedPreferences实现 在Android开发中,SharedPreferences通常被用于存储轻量级的数据,如用户偏好设置或简单的配置信息。然而,原生的SharedPreferences并不提供加密数据的功能,这使得敏感信息可能暴露在风险之中。为了解决这个问题, 开发团队推出了一款名为 的...

gitblog_00004的博客 1043

Android SharePreferences 进行数据进行加密

com.net.security.shareprefs.securitysp; EncryptUtil package com.net.security.shareprefs.securitysp; import android.annotation.SuppressLint; import android.content.Context; import android.os.Build;

风一样的男人 3110

Android 使用MD5对SharedPreferences密码进行加密

在每个Android软件都会使用到SharedPreferences,将密码保存在本地,但是由于没有对密码进行加密,只要用户对手机进行root,获取了权限就很容易得到密码,为了防止密码外露,每个Android软件都要对SharedPreferences的密码进行加密。 在Android中提供了MD5加密,下面就对MD5加密进行一个测试,先创建一个MD5工具类 MD5Utils.java pa

chenfengdejuanlian的专栏 4086

android md5加密封装,Android SharePreference 加密存储及 AndroidKeyStore密钥存储

Android SharePreference 加密存储及 AndroidKeyStore密钥存储前言最近因为项目中对数据存储特别是SharePreference部分数据存储这块有所需求,在查询了一些资料后对这部分内容做了一些封装。框架主要实现了两方面的需求,一是密钥安全存储方面,二就是SharePreference加解密方面的使用。下面会从这两部分进行讲解。简单粗暴上代码如果大家不想看废话可以直...

weixin_42469243的博客 1340

android sharedpreferences加密,让源码告诉你:Android 不要滥用 SharedPreferences(上)

链接:https://www.jianshu.com/p/5fcef7f68341前言本文不是与大家一起探讨关于SharedPreferences的基本使用,而是结合源码的角度分析对 SharedPreferences 使用不当可能引发的“严重后果”以及该如何正确的使用 SharedPreferences。SharedPreferences 是 Android 平台为应用开发者提供的一个轻量级的存...

weixin_34566429的博客 392

SharedPreferense原理和缺陷分析

SharedPreferense 实现原理 简介 SharedPreferences是Android提供给我们的用于存储轻量级K-V数据的持久化方案。以XML文件的形式存储在/data/data/packageName/的shared_prefs文件夹。 它提供了 putString()、putString(Set)、putInt()、putLong()、putFloat()、putBoolean() 六种数据类型。(注意没有Double) 使用示例 //根据文件名,获取SharedPreferences对

欢迎交流 987

支持Android9 邮件加密,SpUtil多样加密存储,兼容android9.0

####前言在android系统不断升级的过程中,Sharepreferences存储出现多中问题,其中有些是读写权限造成,有些是因为加密问题引起。下面介绍下SpUtil这个工具类,它是在Sharepreferences基础上进行了封装优化,具备存储不同数据类型,然后有加密功能,使用简单,在介绍的工程中,还会涉及到一些权限方面的讲解。存储数据类型包括:boolean、int、float、long、...

weixin_39747049的博客 144

EncryptedSharedPreferences:为Android SharedPreferences提供加密

EncyptedSharedPreferences 使用Android Studio 0.8.0的Android库 为SharedPreferences集成系统提供加密。 它使用AES 128位加密技术来保护数据安全,并且与UTF-8兼容元素兼容。 ====================== Gradle集成: 添加存储库依赖项: repositories { jcenter() maven { url "https://github.com/omadahealth/omada-nexus/raw/master/release" } } 将依赖项添加到“ dependencies”中: dependencies { compile 'com.og.encryptedsharedpreferences:encryptedsha

银行类app如何保证安全

银行类app对于安全行的要求比较高,这篇文章整理一些日常开发中的基础知识。 sharedPreference 很多app在使用sharedpreferece储存个人数据,然后这部分储存是不安全的。 1.创建模式要正确MODE_PRIVATE。 因为如果是使用MODE_WORLD_READABLE创建的sharedpreference文件其他app是可以读取到的。如果是使用MODE_WO...

laibowon的专栏 6351

android sharedpreferences加密,(译)使用AndroidX安全加密SharedPreferences

本文译自Encrypting Shared Preferences with the AndroidX Security Library,介绍了AndroidX安全库中EncryptedSharedPreferences的使用。备注:仅支持minSdkVersion 23及以上。《离思五首·其四》曾经沧海难为水,除却巫山不是云。取次花丛懒回顾,半缘修道半缘君。-唐代,元稹Android框架给我们提...

weixin_29471009的博客 1349

Android静态安全检查(十):Shared Preferences存储风险

Shared Preferences存储风险简介Android系统提供了以下四种Android应用本地存储方式:Shared Preferences、SQLite Databases、Internal Storage、External Storage等存储方式。Shared Preferences是一种轻量级的基于XML文件存储的键值对(key-value)数据的数据存储方式,一般用于储存应用的配...

不忘初心的专栏 2118

Android SharedPreferences加密存储

我们都知道sharedPreferences是将信息以键值对的xml格式对存储在应用的对应目录下。对于一些重要信息就十分不安全。我们需要对信息进行加密存储。 即使是加密存储,秘钥的管理也十分重要,如何才能让秘钥不被外界获取,这里我们使用Android系统提供的AndroidKeyStore来提供秘钥,最大程度保证安全性。 object AppKeyStore { private var sApplicationContext: Context? = null private var sSys

奋斗 1475

拿来就用:Androidsharedpreferences 数据进行加密

先来看看效果:这里显示的密文就是存储在SP中的密文,下面我们再来看看sp文件内容这样就起到了在sp存储时的加密功能,下面我们来看看代码,加密我使用的是RSA加密,并把秘钥保存在androidKeyStore中,这样就保险,更加保障了我们的秘钥安全 生成RSA秘钥工具类:AndroidKeyStoreRSAUtils package tsou.com.encryption.AndroidKeyStor

黄孝果的博客 7609
上一篇: OkHttp报错javax.net.ssl.SSLHandshakeException: Handshake failed
下一篇: Android原生项目集成React Native
随便想个名字
博客等级 码龄14年 28粉丝 21原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值