前言
今天整理了一下加密方面的工具类,顺便把它们共享出来。
GitHub地址:https://github.com/seeways/AndroidUtils
由于工作原因,经常会用到加密相关的,虽然用过很多次了,但是一直都没有整理过相关资料,整理也是给领导看看,除了常用的,基本都是翻翻以前的代码,或者google。
上周用到了,今天又用到了,所以决心整理一下,方便自己,整理过程中,觉得可能别人也会用到,就顺便扩展了一下,怕众人和我刚开始一样懵逼,所以特写此文,亦是说明。
几种常用加密方式
MD5
广泛使用的散列算法
准确的说,MD5不能算加密算法,但是由于其简单易用性,所以用的人多了,被误传为加密算法的一种。
MD5是不可逆的运算。
现在很多可以破解的方法,建议搭配使用。
DES
自从有了AES,DES就每况愈下了,毕竟活了几十年的算法,算是寿终正寝了,不多赘述。
AES
AES加密算法是密码学中的高级加密标准。采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。
- 用法
//实例化的时候需要的这个参数通常用很多种模式 Cipher cipher = Cipher.getInstance(transformation);
- 在实例化Cipher的时候需要转化方式,我使用的一般是
AES/CBC/PKCS5Padding
,也有很多人用AES/ECB/NoPadding
- 他们分别代表
法算法名称/加密模式/填充方式
,也就是说,AES,你也可以直接替换成DES(如果不怕被同事打可以试试)
- 在实例化Cipher的时候需要转化方式,我使用的一般是
- 加密模式
- 电子密码本模式ECB
- 加密块链模式CBC
- 加密反馈模式CFB
- 输出反馈模式OFB
- 其中用的最多的是前两种
- 填充方式
- NoPadding
- ZerosPadding
- PKCS5Padding
- 其中用的最多的是P5,要选不填充就没意义了
- 附上十六进制转码
//十六进制转码 private static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; /** * byteArr转hexString * <p>例如:</p> * bytes2HexString(new byte[] { 0, (byte) 0xa8 }) returns 00A8 * * @param bytes 字节数组 * @return 16进制大写字符串 */ private static String bytes2HexString(byte[] bytes) { if (bytes == null) return null; int len = bytes.length; if (len <= 0) return null; char[] ret = new char[len << 1]; for (int i = 0, j = 0; i < len; i++) { ret[j++] = hexDigits[bytes[i] >>> 4 & 0x0f]; ret[j++] = hexDigits[bytes[i] & 0x0f]; } return new String(ret); }
SHA系列
常用的安全散列算法。
这个主要是给用到数字证书的人群使用的,受信任的证书,一般都是由全国30多家CA办法,其中比较屌的也就那几家,BJCA,GDCA等等,SZCA虽然这几年发展势头不错,但和前几家比起来还有一定差距,这个咱们姑且不管,反正他们都能颁发受信任的证书。
如果你不幸用到,国密标准是在SHA256上改造的,只能帮你到这了,怎么用在工具类中已有说明。
目前工具类中有3中常用的:SHA1,SHA256,SHA512。
RSA系列
- 非对称加密算法
- 公钥私钥说的就是它,非常非常非常著名
如果你不幸用到上面的SHA系列了,那么,这个也是你无法避免的。
不过一般私钥需要通过CA办法,不好封装,只是介绍一下。
符合(大天朝)法律的私钥必须通过硬件介质来承载证书,就是我们说的Key,U盾等等。
BASE64
刚在整理资料的时候,看到有的搜索资料上把这个也列上去了,我想说的是,即使是抄,也负点责任好不好?Base64啥时候成加密算法了??
特此说明一下,Base64只是一种常见的编码方式,不是加密算法!!!