Java安全的内容很多,这里主要是讲安全的java应用,即安全的应用程序,不多涉及java的安全机制以及网络安全机制,对于加密解密算法也是不会去了解算法本身,只是了解java的api及应用。
一、对称密钥的生成及以对象序列化方式保存
1、获取密钥生成器
KeyGenerator kg = KeyGenerator.getInstance("DESede");
指定加密算法的名称可以是:Blowfish(448位)、DES、DESede、HmacMD5、HmacSHA1、AES等
2、初始化密钥生成器
kg.init(168);
使用DESede可以是112、168位,DES56位、Blowfish32-448位之间可以被8整除的数,AES可以是128、192、256位
3、生成密钥
SecretKey k = kg.generateKey();
SecretKey 密钥的类型,用于以后的加密解密,此类可以序列化为文本保存罗
4、序列化保存在文件中
FileOutputStream f = new FileOutputStream("key1.dat");
ObjectOutputStream b = new ObjectOutputStream(f);
b.writeObject(k);
ObjectOutputStream类的writeObject方法可以将对象序列化,以上程序将以流的形式传送k到文件key1.dat
5、读取密钥
FileInputStream f= new FileInputStream("key1.dat");
ObjectInputStream b= new ObjectInputStream(f);
Key k =(Key)b.readObject();
6、以字节保存对称密钥
byte[] kb= k.getEncoded();
FileOutputStream f = new FileOutputStream(keykb1.dat);
f.write(kb); 保存字节数组到文件keykb1.dat
for(int i=0;i<kb.length;i++){
System.out.print(kb[i]+",")
}
我们看看输出11,-105,-119,50,4,-105,16,38...
如果我们打开keykb1.dat看到的是乱码,因为.dat是一个二进制文件,存放的是人意的二进制数。
二、使用对称密钥进行加密和解密
1、从文件中获取密码
2、创建密码器(Cipher对象)
Cipher cp = Cipher.getInstance("DESede"); 密码是什么算法的,就要什么算法的名称
3、初始化密码器
cp.init(Cipher.ENCRYPT_MODE,k);
第一个参数说明是加密还是解密,此处加密。第二个参数就是密钥。
4、获取等待加密的明文
String s = "hello world";
byte ptext[] = s.getBytes("UTF8");
加密器(Cipher对象)的操作是针对字节数组的,所以s.getBytes转化字符为数组
5、加密
byte ctext = cp.doFinal(ptext);
6、处理加密结果
如保存结果到文件
FileOutputStream f = new FileOutputStream("SEnc.dat");
f.write(ctext);
这个文件就是一个加密的,在网络上被黑了,但是别人看不懂,除非知道密码解密,
7、解密
获取密文——获取密钥——解密
获取密文
FileInputStream f = new FileInputStream("SEnc.dat");
int num = f.available();
byte[] ctext = new byte[num];
f.read(ctext);
获取密钥
FileInputStream f 1= new FileInputStream("keykb1.dat");
int num2 = f1.available();
byte[] keykb = new byte[num2];
f.read(keykb);
SecretKeySpec k = new SecretKeySpec(keykb,"DESede");
解密:获取密码器并初始化, 然后解密
Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE,k);
byte[] ptext =cp.doFinal(ctext);
String s = new String(ptext,"UTF8");
三、基于口令的加密和加密