安卓项目实战之:Android常用的5种加密方式

安卓项目实战之:Android常用的5种加密方式前言按加密结果是否可以被解密分为:1,不可逆:MD5(Message-Digest消息摘要):不可逆,长度固定(32位),容易计算,仅一字节只差加密结果都会有很大区别通常情况下为了让加密过程变得不可预测,我们会进行加盐操作。SHA:安全散列算法,数字签名工具,长度比MD5要长,所以更安全,但是加密的效率要比MD5慢一些.2,可逆:按秘钥数量和加密规则分为:1,对称加密:即通过key…

大家好,又见面了,我是你们的朋友全栈君。

前言

按加密结果是否可以被解密分为可逆和不可逆:
1,不可逆:
MD5(Message-Digest消息摘要):不可逆,长度固定(32位),容易计算,仅一字节只差加密结果都会有很大区别
通常情况下为了让加密过程变得不可预测,我们会进行加盐操作。
SHA:安全散列算法,数字签名工具 , 长度比MD5要长,所以更安全,但是加密的效率要比MD5慢一些.
2,可逆:
按秘钥数量和加密规则分为:对称加密和非对称加密
1,对称加密:即通过key加密,也可以通过key来解密
优点:算法公开、计算量小、加密速度快、加密效率高 缺点:双方都使用同样的密钥,密钥可以自己指定,并且只有一把,如果密钥泄漏数据就会被解密
DES,AES
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。 这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用,Android 中的AES 加密 秘钥 key 必须为16/24/32位字节,否则抛异常。
2,非对称加密:如RSA加密算法公钥加密只能私钥解密,私钥加密也只能公钥解密
RSA :他有两把密钥,且是由程序生成的,不能自己指定;

特点是加密速度比较慢,但是安全性比较高;

加密和解密的规则是:公钥加密只能私钥解密,私钥加密只能公钥解密;

RSA对加密数据的长度有限制,一般为密钥的长度值-11,要加密较长的数据,可以采用数据截取的方法,分段加密。
RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。

MD5加密

使用场景:
1.验证密码:只要算法不变,就能和服务器上的MD5匹配;
2.文件完整性的校验:当下载一个文件时,服务器返回的信息包括这个文件的md5,在本地下载完毕时进行md5加密,将两个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();
       }

SHA:

著名的图片加载框架Glide在缓存key时就采用的此加密
文件的秒传功能,以及相同的v4包冲突都是可以根据sha1值进行比对的

/** * 使用sha-1方式进行加密 * @return */
       public static String digest(String content){ 
   
        StringBuilder builder = new StringBuilder();
        try { 
   
            MessageDigest msgDitest = MessageDigest.getInstance("SHA-1");
            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();
       }

DES

String data = "我是俊哥";
String desKey = "青龙偃月刀";// 密钥,口号
boolean isDesEncrypt = false;
private void useDes() { 
   
    try { 
   
        if(isDesEncrypt){ 
   
            //解密
            text.setText(Des.decrypt(text.getText().toString(), desKey));
        }else { 
   
            //加密
            text.setText(Des.encrypt(data, desKey));
        }
        isDesEncrypt = !isDesEncrypt;
    
    } catch (Exception e) { 
   
        e.printStackTrace();
    }
}

AES

AES加密是一种高级加密标准,是一种区块加密标准。它是一个对称密码,就是说加密和解密用相同的密钥。WPA/WPA2经常用的加密方式就是AES加密算法。

public class AESUtils3 { 
   

    /* 算法/模式/填充 */
    private static final String CipherMode = "AES/ECB/PKCS5Padding";

    /* 创建密钥 */
    private static SecretKeySpec createKey(String password) { 
   
        byte[] data = null;
        if (password == null) { 
   
            password = "";
        }
        StringBuffer sb = new StringBuffer(32);
        sb.append(password);
        while (sb.length() < 32) { 
   
            sb.append("0");
        }
        if (sb.length() > 32) { 
   
            sb.setLength(32);
        }
        try { 
   
            data = sb.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) { 
   
            e.printStackTrace();
        }
        return new SecretKeySpec(data, "AES");
    }

    /* 加密字节数据 */
    public static byte[] encrypt(byte[] content, String password) { 
   
        try { 
   
            SecretKeySpec key = createKey(password);
            System.out.println(key);
            Cipher cipher = Cipher.getInstance(CipherMode);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (Exception e) { 
   
            e.printStackTrace();
        }
        return null;
    }

    /*加密(结果为16进制字符串) */
    public static String encrypt(String content, String password) { 
   
        byte[] data = null;
        try { 
   
            data = content.getBytes("UTF-8");
        } catch (Exception e) { 
   
            e.printStackTrace();
        }
        data = encrypt(data, password);
        String result = byte2hex(data);
        return result;
    }

    /*解密字节数组*/
    public static byte[] decrypt(byte[] content, String password) { 
   
        try { 
   
            SecretKeySpec key = createKey(password);
            Cipher cipher = Cipher.getInstance(CipherMode);
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (Exception e) { 
   
            e.printStackTrace();
        }
        return null;
    }

    /*解密16进制的字符串为字符串 */
    public static String decrypt(String content, String password) { 
   
        byte[] data = null;
        try { 
   
            data = hex2byte(content);
        } catch (Exception e) { 
   
            e.printStackTrace();
        }
        data = decrypt(data, password);
        if (data == null) return null;
        String result = null;
        try { 
   
            result = new String(data, "UTF-8");
        } catch (UnsupportedEncodingException e) { 
   
            e.printStackTrace();
        }
        return result;
    }

    /*字节数组转成16进制字符串 */
    public static String byte2hex(byte[] b) { 
   
        // 一个字节的数,
        StringBuffer sb = new StringBuffer(b.length * 2);
        String tmp = "";
        for (int n = 0; n < b.length; n++) { 
   
            // 整数转成十六进制表示
            tmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
            if (tmp.length() == 1) { 
   
                sb.append("0");
            }
            sb.append(tmp);
        }
        return sb.toString().toUpperCase(); // 转成大写
    }

    /*将hex字符串转换成字节数组 */
    private static byte[] hex2byte(String inputString) { 
   
        if (inputString == null || inputString.length() < 2) { 
   
            return new byte[0];
        }
        inputString = inputString.toLowerCase();
        int l = inputString.length() / 2;
        byte[] result = new byte[l];
        for (int i = 0; i < l; ++i) { 
   
            String tmp = inputString.substring(2 * i, 2 * i + 2);
            result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);
        }
        return result;
    }
}

RSA

文件或数据在本地使用公钥或私钥加密,加密后的数据传送到服务器,服务器使用同一套密钥中的私钥或者公钥进行解密。

public class RSAUtils { 
   

    //构建Cipher实例时所传入的的字符串,默认为"RSA/NONE/PKCS1Padding"
    private static String sTransform = "RSA/NONE/PKCS1Padding";

    //进行Base64转码时的flag设置,默认为Base64.DEFAULT
    private static int sBase64Mode = Base64.DEFAULT;

    //初始化方法,设置参数
    public static void init(String transform, int base64Mode) { 
   
        sTransform = transform;
        sBase64Mode = base64Mode;
    }

    //产生密钥对
    public static KeyPair generateRSAKeyPair(int keyLength) { 
   
        KeyPair keyPair = null;
        try { 
   
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); //设置密钥长度
            keyPairGenerator.initialize(keyLength); //产生密钥对
            keyPair = keyPairGenerator.generateKeyPair();
        } catch (NoSuchAlgorithmException e) { 
   
            e.printStackTrace();
        }
        return keyPair;
    }

    /** * 加密或解密数据的通用的方法,srcData:待处理的数据;key:公钥或者私钥,mode指 * 加密还是解密,值为Cipher.ENCRYPT_MODE或者Cipher.DECRYPT_MODE */
    public static byte[] processDAta(byte[] srcData, Key key, int mode) { 
    
        //用来保存处理的结果
        byte[] resultBytes = null; 
        //构建Cipher对象,需要传入一个字符串,格式必须为"algorithm/mode/padding"或者"algorithm/",意为"算法/加密模式/填充方式"
        try { 
   
            Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding"); 
            //初始化Cipher,mode指定是加密还是解密,key为公钥或密钥
            cipher.init(mode, key); 
            //处理数据
            resultBytes = cipher.doFinal(srcData);
        } catch (Exception e) { 
   
            e.printStackTrace();
        }
        return resultBytes;
    } 
    
    //使用公钥加密数据,结果用Base64转码
    public static String encryptDataByPublicKey(byte[] srcData, PublicKey publicKey) { 
   
        byte[] resultBytes = processDAta(srcData, publicKey, Cipher.ENCRYPT_MODE);
        return Base64.encodeToString(resultBytes, sBase64Mode);
    } 
    
    //使用私钥解密,结果用Base64转码
    public static byte[] decryptDataByPrivate(String encryptedData, PrivateKey privateKey) { 
   
        byte[] bytes = Base64.decode(encryptedData, sBase64Mode);
        return processDAta(bytes, privateKey, Cipher.DECRYPT_MODE);
    } 
    
    //使用私钥解密,返回解码数据
    public static String decryptToStrByPrivate(String encryptedData, PrivateKey privateKey) { 
   
        return new String(decryptDataByPrivate(encryptedData, privateKey));
    }
   
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145557.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月17日 上午7:40
下一篇 2022年5月17日 上午7:40


相关推荐

  • css代码样式大全(整理版)

    css代码样式大全(整理版)css 代码样式大全 整理版 这几天一直在写一个动态网站 布局就弄了好久 看到一篇博客 发现 css 样式代码写的很详细 为此记录下来 这几天一直再写一个动态网站 布局就弄了好久 看到一篇博客 发现 css 样式代码写的很详细 为此记录下来 字体属性 font 大小 font size x large 特大 xx small 极小 一般中文用不到 只要用数值就可以 单位 PX PD 样式 font style oblique 偏斜体 italic 斜体 normal 正常 行高

    2026年3月19日
    2
  • emscripten安装

    emscripten安装webAssembly 技术的提出已近 10 来年 在国内一直处于不温不火的状态 网上有一些相关教程 大多比较零散 缺乏系统性 由于在开发遥感图像 Web 版本标注过程中 用到该技术 借此机会将将该技术记录下来 为后来者提供参考 工欲善其事必先利其器 emscripten 就是我们第一样兵器 它的基础的安装教程可参考下面的教程 Downloadandi Emscripten3 1 9 git dev documentatio emscripten org docs

    2026年3月16日
    2
  • IIS无法启动解决方案

    IIS无法启动解决方案br IIS 启动提示 br nbsp br WorldWideWeb 服务因下列错误而停止 br 无法使用已在使用中的标识启动新的会话 br nbsp br 由于错误 WorldWideWeb 服务正在退出 数据字段包含错误号 br nbsp br 有时重启电脑可以解决 有时不可以 br nbsp br 重装 MSDTC 服务可解决 br nbsp br br br IIS 无法打开 asp 文件之 MSD

    2026年3月16日
    2
  • js设置定时从一个页面跳转到另一个页面

    js设置定时从一个页面跳转到另一个页面主要实现点击链接进入视频介绍 设置定时 然后跳转到另一个页面代码如下 lt scripttype text javascript gt functionjump location http localhost 8080 Socket first page jsp functionurl setTimeout jumpu

    2025年7月3日
    6
  • 搜寻旁站、c站

    搜寻旁站、c站旁站 旁站是和目标网站在同一台服务器上的其它的网站 C 段 C 段是和目标服务器 ip 处在同一个 C 段的其它服务器 0x01 在线网站查询工具还是我们的老朋友 同 IP 网站查询 同服务器网站查询 站长工具 FOFA 地址 https fovfa so Shodan 地址 ShodanSearch 使用软件御剑御剑无字典大小限制版 Nmapnmap Pn sVwww moonsec comnmap Rn sV103 97 177 22

    2026年3月19日
    1
  • 从零造 “手脚”:OpenClaw 自定义 Skills 开发实战 —— 让 AI 按你的想法干活

    从零造 “手脚”:OpenClaw 自定义 Skills 开发实战 —— 让 AI 按你的想法干活

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号