import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.security.AlgorithmParameters;
import java.security.MessageDigest;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import java.util.Date;
import javax.crypto.Cipher;
import javax.crypto.SealedObject;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import com.yoursite.bean.UserInfo;
public class SerializationUtil {
static String algorithm = "AES";
static Cipher encrypter = null, decrypter = null;
static {
setupCrypt();
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
UserInfo customer = new UserInfo("河蟹", "xxx@gmail", new Date(0));
File file = new File("D:\\instance.obj");
serialization(file,customer);
customer = (UserInfo)deserialization(file);
System.out.println(customer);
}
// 反序列化对象
public static Object deserialization(File file) throws Exception {
ObjectInputStream in = null;
SealedObject sealed = null;
Object object = null;
try {
in = new ObjectInputStream(new FileInputStream(file));
sealed = (SealedObject) in.readObject();
object = sealed.getObject(decrypter);
} catch (Exception e) {
throw e;
} finally {
if (in != null)
in.close();
}
return object;
}
// 序列化对象
@SuppressWarnings("unused")
public static void serialization(File file,Object object) throws Exception {
ObjectOutputStream out = null;
SealedObject sealed = null;
try {
out = new ObjectOutputStream(new FileOutputStream(file));
sealed = new SealedObject((Serializable) object, encrypter);
out.writeObject(sealed);
} catch (Exception e) {
throw e;
} finally {
if (out != null)
out.close();
}
}
private static byte[] getMD5(String input) {
try {
byte[] bytesOfMessage = input.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
return md.digest(bytesOfMessage);
} catch (Exception e) {
return null;
}
}
@SuppressWarnings("unused")
private static void setupCrypt() {
String key ="helloworld";
SecretKeySpec skey = new SecretKeySpec(getMD5(key), algorithm);
// Create an 8-byte initialization vector
byte[] iv = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
try {
encrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");
decrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");
// CBC requires an initialization vector
encrypter.init(Cipher.ENCRYPT_MODE, skey, paramSpec);
decrypter.init(Cipher.DECRYPT_MODE, skey, paramSpec);
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unused")
private static void setupCrypt2() {
//key需要128
String key = "81865011520190145659841015258206940634698416000116687963543955828649380740817034326700266554532335762191268533799481074944660845";
char[] password = key.toCharArray();
byte[] salt = "123456".getBytes();
SecretKeyFactory factory = null;
SecretKey tmp = null;
KeySpec spec = new PBEKeySpec(password, salt, 1024, 128);
try {
factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
tmp = factory.generateSecret(spec);
} catch (Exception e) {
e.printStackTrace();
}
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), algorithm);
try {
encrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");
encrypter.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = encrypter.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
decrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");
decrypter.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@SuppressWarnings("unused")
private static void setupCrypt3() {
//16位
String key = "0123456789123456";
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), algorithm);
try {
encrypter = Cipher.getInstance(algorithm);
encrypter.init(Cipher.ENCRYPT_MODE, skeySpec);
decrypter = Cipher.getInstance(algorithm);
decrypter.init(Cipher.DECRYPT_MODE, skeySpec);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
一些有用链接
http://stackoverflow.com/questions/992019/java-256bit-aes-encryption/992413#992413
http://www.ibm.com/developerworks/cn/java/j-5things1/?ca=drs-cn-0504
分享到:
相关推荐
PHP AES加密器 一个处理数据的AES加密的简单类免责声明:虽然加密/解密已经过测试,但尚未由安全专家审核。 使用风险自负。安装使用composer安装 composer require tebru/aes-encryption用法只需使用一个密钥实例化...
AES加密和解密字符串(和/或序列化)数据 如何使用它。 直接从代码调用:SimpleAESEncryption.Encrypt和SimpleAESEncryption.Decrypt AES加密如何工作? 当使用AES使用密码对某些明文进行加密时,会同时生成加密...
日期处理// 时间处理// 时间戳// Unix 时间换算// 时间 - 周 换算// AES 加密解密// DES 加密解密// MD5 原生算法// MD5 算法(依赖系统)// 标志枚举运算// Guid 格式处理// 模型序列化// 字符串处理(StringTool)...
生成的实例可以序列化。 您可能还对我对 Chow 的生成器和模拟器的实现感兴趣。 它还包含 Karroumi 白盒方案和 Billet 等人的实现。 密钥恢复攻击(未在 Java 版本中实现)。 依赖关系 Maven BouncyCastle (Maven ...
AES加密过程 将要加密的内容复制到状态数组中 密钥加操作,初始化密钥 执行Nr次轮函数 将最终的状态数组复制到输出数组 密钥长度 轮数Nr AES-128 10 AES-192 12 AES-256 14 四个轮函数 SubBytes() ...
始终如一地序列化和反序列化密文、IV 和密钥材料,以使其易于存储。 算法和模式:我们选择了:AES 128、CBC 和 PKCS5 填充。 我们会选择 GCM 来进行其内置的完整性检查,但这仅在 Android Jelly Bean 之后可用。 IV ...
shiro反序列化利用工具,支持shiro大于1.2.4的aes加密的反序列号
3.包分为OpCode和Parameters,用binary序列化反序列化Parameters 4.使用数据库存储用户信息、好友关系、房间信息、加入房间状态、所有聊天记录 5.基于tkinter的GUI设计 6.有新消息时自动滚动到底部 7.窗口放大缩小 8...
21种加密54种压缩 算法模块[推荐] BMP压缩成JPG的源代码 ...QQ 2005贺岁版登录口令加密算法及其源码 SINE256加密可视化以及控制示例 ...顶级AES加密类模块 高级指纹分算法析源代码 最长公共子序列 。。。。
json序列化和反序列化][二八例 protobuf序列化和反序列化][二九例 包管理工具 go vendor][三十例 包管理工具 go mod][三一例 zip压缩][三二例 交叉编译][三三例 线上环境部署][三四例 实现固定周期维护][三五例 聊天...
Persistence 额外支持使用 FastJSON、Moshi、Kryo、Hessian、FST、Protobuf 实现对象的序列化和反序列化 Persistence 的 AbstractConverter 拥有加密功能,默认使用 AES 128、DES 算法进行加密 支持显示
关于AES-SID是一种确定性地将64位整数(例如数据库主密钥)加密为128位密文的技术,可以将其序列化为例如UUID。 尽管存在许多提供这些一般属性的方案,但AES-SID通过适用于耐滥用身份验证的加密(即合成初始化向量)...
该对称图像加密算法以Logistic映射和Chebyshev映射生成的混沌序列为初始序列,以AES算法的S盒变换和记忆存储作为非线性变换。实验结果证明,算法克服了初始混沌序列和初始信号的相关性,输出的序列满足平衡性、大...
包分为OpCode和Parameters,用binary序列化反序列化Parameters 使用数据库存储用户信息、好友关系、房间信息、加入房间状态、所有聊天记录 tkinter GUI 有新消息时自动滚动到底部 窗口放大缩小 服务器、客户端...
SerializeUtils - 序列化、反序列化对象 ZipUtils - 压缩、解压文件 json JsonUtils - json格式转换 lang CharsetDetectorUtils - 获取文本文件编码格式 ChineseCalendar - 农历日历 ConvertUtils - 高低字节...
与项目相关文章首发于:Shiro exp使用手册Shiro rememberMe反序列化漏洞漏洞原理Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie,服务端对rememberMe的cookie值...
json数据包反序列化 开箱即用的加密聊天 例子 服务器 这个小例子展示了服务器的基本实现。 public class MyServer extends Server { public MyServer ( int port , String password , int maxClients ) { super...
四郎用remembreme这个cookie的对用户进行鉴权,防止出现越权问题,它使用CookieRemembreMeManager这个类,对remebremecookie的键使用ObjectInputStream类进行序列化,然后对字符流进行用AES加密方式对其进行的base...
4、使用rememberMe攻击字符串重新请求网站,进行反序列化攻击,最终导致远程任意命令执行。 ———————————————— 版权声明:本文为CSDN博主「不务正业的程序员。」的原创文章,遵循CC 4.0 BY-SA版权...