Android应用常用的加密方式

news/2024/11/23 0:26:18/
Android数据加密的方式,按加密的内容是否可以还原,可以分为可逆加密和非可逆加密。

非可逆加密: 加密后的数据不能还原成原来的数据,如MD5,sha1。
可逆加密: 可逆加密有一个公钥和一个私钥,通过公钥加密,私钥解密。常用的有:RSA,AES。

MD5

  • 使用场景:
    1.一致性验证,比如下载某个文件,不知道文件是否下载完成,可以MD5进行校验。加密文件比较耗时,应放到子线程中。
    2.密码的存储,如登陆注册这些,账号密码会保存到sp中,如果直接保存账号密码的MD5值。

  • 代码实现:

      /***  使用md5方式进行加密*  @return*/public static String digest(String content){StringBuilder builder = new StringBuilder();try {MessageDigest msgDitest = MessageDigest.getInstance("MD5");msgDitest.update(content.getBytes());byte[] digests = msgDitest.digest();//将每个字节转为16进制for (int i=0;i<digests.length;i++){builder.append(Integer.toHexString(digests[i] & 0xff +8));//+8为加盐操作}} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return  builder.toString();}

RSA

  • 加密原理:
    1、随机选择两个大的质数P和Q,P不等于Q,计算出结果:N = PQ;
    2、选择一个大于1,小于N的自然数E,E必须和(P-1)
    (Q-1)互素;
    3、用公式计算出D:DE = mod(P-1)(Q-1);
    4、销毁P和Q。最终得到的N,E就是公钥,D就是私钥了。
  • 使用场景:
    项目中一些敏感的数据,比如身份证号,银行卡号,支付密码等相关敏感信息可以加密后再传输到服务端,服务端使用私钥进行解密。

-密钥对的生成:

    /*初始化KeyPairGenerator类,并获取到公钥和私钥*/byte[] publicKeyByte;byte[] prvateKtyByte;public void getKey() {try {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(“RSA”);//KeyPairGenerator类是java专门提供生成密钥对的一个类。keyPairGenerator.initialize(1024); //设置密钥对的大小KeyPair keyPair = keyPairGenerator.generateKeyPair();PrivateKey privateKey = keyPair.getPrivate();//获取私钥PublicKey publicKey = keyPair.getPublic();//获取公钥prvateKtyByte = privateKey.getEncoded();//私钥对应的字节数组publicKeyByte = publicKey.getEncoded(); //公钥对应的字节数组} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}

-公钥加密:

    public byte[] encryption(String content) {byte[] result = null;try {Cipher cipher = Cipher.getInstance("RSA");X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKeyByte);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);cipher.init(Cipher.ENCRYPT_MODE, publicKey);result = cipher.doFinal(content.getBytes());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();}return result;}
  • 私钥解密:
    public void decryption() {Cipher cipher = null;try {cipher = Cipher.getInstance("RSA");//私钥需要通过PKCS8EncodedKeySpec来读取PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(prvateKtyByte);KeyFactory keyFactory = KeyFactory.getInstance("RSA");//生成私钥PrivateKey privateKey = keyFactory.generatePrivate(keySpec);cipher.init(Cipher.DECRYPT_MODE, privateKey);//String content = "123456";byte[] input = encryption("123456");byte[] result = cipher.doFinal(input);} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();}}

AES

  • 使用场景:AES是对称加密,加解密都是使用一个key,在项目中将一些敏感数据保存在本地,要使用时再取出来解密。

  • 代码实现:

public class AesUtils {/*** @param* @return AES加密算法加密*/public static String encrypt(String seed, String key)throws Exception {byte[] rawKey = getRawKey(key.getBytes());byte[] result = encrypt(seed.getBytes("utf-8"), rawKey);return toHex(result);}public static byte[] encryptByte(String seed, String key)throws Exception {byte[] rawKey = getRawKey(key.getBytes());return encrypt(seed.getBytes("utf-8"), rawKey);}public static String decryptString(byte[] byteData, byte[] byteKey) throws Exception {byte[] rawKey = getRawKey(byteKey);byte[] result = decrypt(byteData, rawKey);return new String(result, "UTF8");}/**** AES加密算法加密* @param byteData 数据* @param byteKey key*/private static byte[] encrypt(byte[] byteData, byte[] byteKey) throws Exception {return Ase(byteData, byteKey, Cipher.ENCRYPT_MODE);}/**** AES加密算法解密* @param byteData 数据* @param byteKey key*/private static byte[] decrypt(byte[] byteData, byte[] byteKey) throws Exception {return Ase(byteData, byteKey, Cipher.DECRYPT_MODE);}/***** @param byteData* @param byteKey* @param opmode*/private static byte[] Ase(byte[] byteData, byte[] byteKey, int opmode) throws Exception {Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");SecretKeySpec skeySpec = new SecretKeySpec(byteKey, "AES");cipher.init(opmode, skeySpec);byte[] decrypted = cipher.doFinal(byteData);return decrypted;}private static byte[] getRawKey(byte[] seed) throws Exception {KeyGenerator kgen = KeyGenerator.getInstance("AES");SecureRandom sr = null;int sdk_version = android.os.Build.VERSION.SDK_INT;if (sdk_version > 23) {  // Android  6.0 以上sr = SecureRandom.getInstance("SHA1PRNG", new CryptoProvider());} else if (sdk_version >= 17) {sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");} else {sr = SecureRandom.getInstance("SHA1PRNG");}sr.setSeed(seed);kgen.init(128, sr); // 192 and 256 bits may not be availableSecretKey skey = kgen.generateKey();byte[] raw = skey.getEncoded();return raw;}public static class CryptoProvider extends Provider {/*** Creates a Provider and puts parameters*/public CryptoProvider() {super("Crypto", 1.0, "HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature)");put("SecureRandom.SHA1PRNG","org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl");put("SecureRandom.SHA1PRNG ImplementedIn", "Software");}}private static String toHex(byte[] buf) {final String HEX = "0123456789ABCDEF";if (buf == null)return "";StringBuffer result = new StringBuffer(2 * buf.length);for (int i = 0; i < buf.length; i++) {result.append(HEX.charAt((buf[i] >> 4) & 0x0f)).append(HEX.charAt(buf[i] & 0x0f));}return result.toString();}private static byte[] toByte(String hexString) {int len = hexString.length() / 2;byte[] result = new byte[len];for (int i = 0; i < len; i++)result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),16).byteValue();return result;}
}

http://www.ppmy.cn/news/734455.html

相关文章

Android 应用的加密

首先介绍下背景&#xff0c;受朋友之托&#xff0c;开发一款应用&#xff0c;要求对apk进行加密。毕竟自己的辛苦成果被别人拿走是一件叫人十分不爽的事情。而且还没有经过你的同意。:( 先介绍下现在的破解软件 这里介绍的是一款叫做 Gapktool 的工具&#xff0c;傻瓜式的操作 …

App端安全性加密策略

为了保障政府主体的数据通信安全&#xff0c;涉及到敏感数据在公网上的传输时&#xff0c;需要对请求入参和响应进行非对称加密&#xff0c;且保证以下两点以确认安全性&#xff1a; 客户端不留存私钥&#xff08;存在反编译和暴力解包风险&#xff09;**私钥在任何时候都不经…

OPPO手机里面的快应用是什么

手机应用越来越多&#xff0c;应用占用空间、缓存也越来越多&#xff0c;而手机的存储也越来越捉襟见肘&#xff0c;作为一直致力于解决用户需求的OPPO新增加了快应用这个功能&#xff0c;快应用的优点是无需下载安装应用&#xff0c;点击即可打开应用&#xff0c;那快应用到底…

oppo应用认领,将应用一致的签名写入空包

开始建一个文件夹&#xff0c;放入要签名的apk和jks文件 然后进入powershell&#xff0c;管理员模式&#xff0c;进入本文件 复制文件地址进入 输入以下命令&#xff1a;jarsigner -verbose -keystore 你的.jks -signedjar 重新签名以后的.apk 你要签名的.apk 你的证书别名 原命…

OPPO开放平台移动应用认领

作为客户很多都不太懂技术&#xff0c;所以上架应用商店这事儿交给开发去办了。项目交付后由于项目资料交接不全&#xff0c;开发离职或外包项目&#xff0c;无法知道应用商店的帐号和密码了。新开帐号无法上架商店&#xff0c;用别的帐户已上架的同包名同证书的APP应用重名。这…

加密和安全

目录 1 安全机制 1.1 墨菲定律 1.2 信息安全防护的目标 1.3 安全防护环节 1.4 常见的安全攻击 STRIDE 1.5 安全设计基本原则 1.6 常用安全技术 1.7 加密算法和协议 1.7.1 对称加密算法 1.7.2 非对称加密算法 1.7.3 单向哈希算法 1.7.4 综合应用多种加密算法 1.7.5 密…

设置-安全-手机加密功能讲解

设置-安全-手机加密功能讲解 此功能可以用来加密手机上的所有数据&#xff0c;包括 Google 帐户、应用数据、音乐和其他媒体信息、已下载的信息等。如果执行了加密操作&#xff0c;您每次开机时都必须输入数字 PIN 或密码。 请注意&#xff0c;上述 PIN 或密码与您在未加密状态…

《OPPO安全——安全与隐私小课堂》之 日防夜防,“隐私窃贼“难防?手把手教你如何使用OPPO手机管理应用权限

2020年7月16日&#xff0c;央视315晚会曝光手机软件暗藏“窃贼“——SDK&#xff0c;它们不仅可能会在未经用户许可的情况下&#xff0c;收集设备信息、地理位置、通讯录等用户隐私&#xff0c;甚至还可能会传输和储存包括移动金融类APP验证码在内的短信内容&#xff0c;给用户…