使用java实现MD5、BASE64、RSA的方法
上一节我们说了,关于spring mvc 项目的一些安全知识,设计到HTTPS、tomcat、SSL证书,此外还说到了公私钥的制作,这个是从我们在外部环境的角度来解决的安全问题,对于我们的程序,我们为了使得数据根据安全,我们玩玩还需要对我们的原数据进行一次加密与解密,和签名。 关于加密的算法有很多方式,我们平时见的最多的就是MD5\BASE64\RSA,这三种,当然还有DES、移位的加密,还有AES等等,这里我就一MD5\BASE64\RSA为例,说一说它们如何用JAVA实现的。 1、MD5 严格的来说,MD5根本不是加密算法,它只是一种用来保证数据完整性的散列函数,我们称它为摘要算法,或者是哈希算法。它主要应用在对一段信息(Message)产生信息摘要(Message-Digest),这样可以有效防止文件被篡改。对于我们平时网站的登陆的密码会经常看到了MD5的算法,由于MD5它是不可逆的一种算法,我们可以在发送数据的之前对我们的密码进行加密,传递这个MD5值的数据到数据库。 对于MD5生成的几个步骤 生成信息摘要。 将要输入的数据转换成字节数组 计算摘要 将字节数组转换成字符串。 由于本身在Java语言里,java.security包已经提供了信息摘要的生成的方法 MessageDigest alg = MessageDigest.getInstance("MD5"); 以下是使用Java生成的方法 public static String MD5(String src) { try { if (src == null) { return ""; } byte[] result = null; MessageDigest alg = MessageDigest.getInstance("MD5");//生成信息摘要。 result = alg.digest(src.getBytes("utf-8"));//将要输入的数据转换成字节数组,并且计算摘要 return byte2String(result);将字节数组转换成字符串。 } catch (Exception e) { throw new RuntimeException(); } } private static String byte2String(byte[] b) { if (b == null) { return ""; } StringBuffer hs = new StringBuffer(); String stmp = null; for (int n = 0; n < b.length; n++) { stmp = Integer.toHexString(b[n] & 0XFF); if (stmp.length() == 1) { hs.append("0"); } hs.append(stmp); } return hs.toString(); } 2、BASE64 BASE64是作为一种在计算机传输8Bit字节代码的编码方式,用于转换成二进制数据传输,它的编码方式是不可读的。 对于我们的spring 项目,我们可以使用apache的commons包,它可以集成了我们的编码方式,使用很简单,org.apache.commons.codec.binary.Base64 以下是使用base64的方法 public static String Base64encode(String info){ byte[] result = Base64.encodeBase64(info.getBytes()); return byte2String(result); } public static String Base64decode(String info){ String decodeStr = new String(Base64.decodeBase64(info.getBytes())); return decodeStr; } 3、RSA RSA算法是能可以用于加密和数字签名的算法,目前的支付系统基本都是使用这个签名的算法。 RSA加密的工作原理可以这样理解:公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用 解密者拥有私钥,并且将由公钥发布给加密者。加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解密将密文解码为明文。 我们有这样的一个场景,我们客户端需要发送一条加密的信息到服务器。 产生公钥和私钥。 客户端携带私钥,服务器拥有公钥。 由客户端发送到服务器的场景: 客户端将信息用公钥加密,然后发送给服务器,服务器收到信息后,使用私钥解密,得到明文, 对于java的实现方法如下 /** * 加密 * @param data 数据 * @param publickey 公钥 * @param input_charset 编码格式 * @return 加密后的字符串 */ public static String encrypt(byte[] data, String publickey, String input_charset) throws Exception { // 对公钥解密 byte[] keyBytes = Base64.decodeBase64(publickey); // 取得公钥 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); // 对数据加密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return new String(cipher.doFinal(data), input_charset); } /** * 解密 * @param content 密文 * @param private_key 私钥 * @param input_charset 编码格式 * @return 解密后的字符串 */ public static String decrypt(String content, String private_key, String input_charset) throws Exception { byte[] keyBytes; keyBytes = Base64.decodeBase64(private_key); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); InputStream ins = new ByteArrayInputStream(Base64.decodeBase64(content)); ByteArrayOutputStream writer = new ByteArrayOutputStream(); //rsa解密的字节大小最多是128,将需要解密的内容,按128位拆开解密 byte[] buf = new byte[128]; int bufl; while ((bufl = ins.read(buf)) != -1) { byte[] block = null; if (buf.length == bufl) { block = buf; } else { block = new byte[bufl]; for (int i = 0; i < bufl; i++) { block[i] = buf[i]; } } writer.write(cipher.doFinal(block)); } return new String(writer.toByteArray(), input_charset); }
作者:头条号 / 一点热
链接:http://toutiao.com/i6293636423606075905/
来源:头条号(今日头条旗下创作平台)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:头条号 / 一点热
链接:http://toutiao.com/i6293636423606075905/
来源:头条号(今日头条旗下创作平台)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。