Base64の暗号化と復号化
通常、暗号化には基本的に常に復号化が伴います。いわゆる暗号化または復号化には、多くの場合、いくつかのルールが必要です。JDK1.8以降、暗号化処理クラスの新しいセットであるBase64処理が提供されています。このクラスには2つの内部クラスがあります。
- Base64.Encoder:暗号化処理を実行します。
- public byte [] encode(byte [] src)Base64エンコード方式を使用して、指定されたバイト配列内のすべてのバイトを新しく割り当てられたバイト配列にエンコードします
- Base64.Decoder:復号化処理を実行します。
- public byte [] decode(byte [] src):Base64エンコード方式を使用して、入力バイト配列のすべてのバイトをデコードし、その結果を新しく割り当てられた出力バイト配列に書き込みます。
例:暗号化および復号化操作を実装する
package 开发支持类库;
import java.util.Base64;
public class Base64类 {
public static void main(String[] args) {
//加密
String msg = "加密内容"; //要发送的信息内容
//getEncoder()返回一个Base64编码方案,encode利用此方法进行加密
byte[] enMsg = Base64.getEncoder().encode(msg.getBytes()); //数据加密
String enString = new String(enMsg); //转换为String
System.out.println("加密后:"+enString);
//解密
byte[] deMsg = Base64.getDecoder().decode(enMsg); //解密,getDecoder()返回一个Base64编码方案,decode进行解密
String deString = new String(deMsg);
System.out.println("解密结果:"+deString);
}
}
暗号化後:vNPD3MTayN0 =
復号化結果:暗号化されたコンテンツ
Base64は暗号化と復号化の処理を実装できますが、アルゴリズムのパブリックバージョンであるため、データを直接暗号化するのは安全ではないことが多いため、ソルト操作を使用するのが最善の方法です。
String salt = "javaDemo"; //定义盐值
String msg = "加密内容"+"{"+salt+"}"; //加上了盐值,数据不只有加密内容
ソルト値が実際に暗号化の効果があまり良くないことを発見したとしても、最良の方法は複数回暗号化することです。
例:複雑な暗号化操作
package 开发支持类库;
import java.util.Base64;
public class Base64类 {
public static void main(String[] args) {
//加密
String str =StringUtil.encode("加密内容") ;
System.out.println(str);
//解密
str = StringUtil.decode(str);
System.out.println(str);
}
}
class StringUtil{
private static final String SALT = "盐值"; //公共的盐值
private static final int RPEAT = 3; //加密次数
/**
* 加密处理
* @param str 要加密的字符串,需要与盐值整合
* @return 加密后的数据
*/
public static String encode(String str) { //加密处理
String temp = str +"{"+SALT+"}"; //盐值对外不公布
byte data[] = temp.getBytes(); //将字符串变为字节数组
for(int x = 0;x <RPEAT ;x++) {
data = Base64.getEncoder().encode(data); //重复加密
}
return new String(data); //字节数组转为字符串,返回加密结果
}
/**
* 解密处理
* @param str 解密的字符串
* @return 解密后的内容
*/
public static String decode(String str) {
byte data[] = str.getBytes();//将字符串变为字节数组
for(int x = 0;x <RPEAT ;x++) {
data = Base64.getDecoder().decode(data); //重复解密,之前加密多少次就解密多少次
}
return new String(data).replaceAll("\\{\\S+\\}", "");//S表示任何非空格的字符,将括号和里面所有内容替换成null,字节数组转为字符串,返回解密结果
}
}
ZGs1UVJETk5WR0Y1VGpFM01HTTNWM1JZTUQwPQ ==
暗号化されたコンテンツ
2〜3の暗号化プログラムを使用して、完全に復号化できない暗号化方法を見つけるのが最善です。