因为研究GOOGLE的SSO DEMO,里面提到了XML DIGITAL SIGNATURE(JSR-105),然后又涉及到java security本身的一些东西,特此记录一下。
首先来说java security包含的几类
1.Message Digest(消息摘要),主要的算法有MD5和SHA1(算法本身为不可逆的),jdk本身都有支持,可以当作加密来用,举例比如说密码保存,当前用户A的设定密码123456,然后保存到数据库是用MD5加密过的字符串,当用户登录时,把输入的密码同样用MD5加密,然后与数据库中的比较,相同的话就认为密码是正确的。而在JSR-105中,主要的作用是对xml的信息进行摘要,然后摘要进行数字签名,这样比对整体xml的信息进行签名速度上要快很多。
2.Digital Signature(数字签名),一般采用的比较多的是非对称算法的公密钥体系,典型的是DSA和RSA,jdk本身也都有支持,基本过程如下,有字符串“ABC”要签名,先生成公密钥对,然后把用私钥签名,当需要验证签名时,使用公钥对字符串“ABC”进行处理后比对签名,来确认字符串“ABC”是否被修改过。在JSR-105中,一般公钥是放在saml中的,客户端接收到xml信息后,拿出xml信息的摘要和公钥进行签名,然后与xml里面本身的签名比对。
3.单钥密码,主要的算法有DES和AES(算法本身是可逆的),具体的例子就不多说了。
4.证书体系,这个东西比较复杂,不是三言两语能够说清楚的,这里就不讲了。
以上所有的详细内容可以看JAVA.2核心技术.卷II:高级特性7th。
5.Diffie-Hellman密钥一致协议(其他文章上看来的,也写在这里),公开密钥密码体制的奠基人Diffie和Hellman所提出的 "指数密钥一致协议" (Exponential Key Agreement Protocol),该协议不要求别的安全性先决条件,允许两名用户在公开媒体上交换信息以生成 "一致"的,可以共享的密钥。
大概过程如下:如 A 和 B 之间,A 现生成DH类型的密钥对,然后把公钥给B,B从A发送来的公钥中读出DH密钥对的初始参数生成bob的DH密钥对,B根据A的公钥生成本地的DES密钥,B已经生成了他的DES密钥,他现把他的公钥发给A,A根据B的公钥生成本地的DES密钥,通过这个过程就生成了相同的DES密钥,在这种基础就可进行安全能信。
import java.io.*;
import java.math.BigInteger;
import java.security.*;
import java.security.spec.*;
import java.security.interfaces.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import com.sun.crypto.provider.SunJCE;
public class testDHKey {
public static void main(String argv[]) {
try {
testDHKey my= new testDHKey();
my.run();
} catch (Exception e) {
System.err.println(e);
}
}
private void run() throws Exception {
Security.addProvider (new com.sun.crypto.provider.SunJCE());
System.out.println("ALICE: 产生 DH 对 ...");
KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance("DH");
aliceKpairGen.initialize (512);
KeyPair aliceKpair = aliceKpairGen.generateKeyPair(); //生成时间长
// 张三(Alice)生成公共密钥 alicePubKeyEnc 并发送给李四(Bob) ,
//比如用文件方式,socket.....
byte[] alicePubKeyEnc = aliceKpair.getPublic ().getEncoded();
//bob接收到alice的编码后的公钥,将其解码
KeyFactory bobKeyFac = KeyFactory.getInstance("DH");
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec (alicePubKeyEnc);
PublicKey alicePubKey = bobKeyFac.generatePublic(x509KeySpec);
System.out.println("alice公钥bob解码成功");
// bob必须用相同的参数初始化的他的DH KEY对,所以要从Alice发给他的公开密钥,
//中读出参数,再用这个参数初始化他的 DH key对
//从alicePubKye中取alice初始化时用的参数
DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams();
KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance("DH");
bobKpairGen.initialize(dhParamSpec);
KeyPair bobKpair = bobKpairGen.generateKeyPair();
System.out.println("BOB: 生成 DH key 对成功");
KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH");
bobKeyAgree.init(bobKpair.getPrivate());
System.out.println("BOB: 初始化本地key成功");
//李四(bob) 生成本地的密钥 bobDesKey
bobKeyAgree.doPhase(alicePubKey, true);
SecretKey bobDesKey = bobKeyAgree.generateSecret("DES");
System.out.println("BOB: 用alice的公钥定位本地key,生成本地DES密钥成功");
// Bob生成公共密钥 bobPubKeyEnc 并发送给Alice,
//比如用文件方式,socket.....,使其生成本地密钥
byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();
System.out.println("BOB向ALICE发送公钥");
// alice接收到 bobPubKeyEnc后生成bobPubKey
// 再进行定位,使aliceKeyAgree定位在bobPubKey
KeyFactory aliceKeyFac = KeyFactory.getInstance("DH");
x509KeySpec = new X509EncodedKeySpec(bobPubKeyEnc);
PublicKey bobPubKey = aliceKeyFac.generatePublic(x509KeySpec);
System.out.println("ALICE接收BOB公钥并解码成功");
;
KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH");
aliceKeyAgree.init(aliceKpair.getPrivate());
System.out.println("ALICE: 初始化本地key成功");
aliceKeyAgree.doPhase(bobPubKey, true);
// 张三(alice) 生成本地的密钥 aliceDesKey
SecretKey aliceDesKey = aliceKeyAgree.generateSecret("DES");
System.out.println("ALICE: 用bob的公钥定位本地key,并生成本地DES密钥");
if (aliceDesKey.equals(bobDesKey)) System.out.println ("张三和李四的密钥相同");
//现在张三和李四的本地的deskey是相同的所以,完全可以进行发送加密,接收后解密,达到
//安全通道的的目的
/*
* bob用bobDesKey密钥加密信息
*/
Cipher bobCipher = Cipher.getInstance("DES");
bobCipher.init(Cipher.ENCRYPT_MODE, bobDesKey);
String bobinfo= "这是李四的机密信息";
System.out.println("李四加密前原文:"+bobinfo);
byte[] cleartext =bobinfo.getBytes();
byte[] ciphertext = bobCipher.doFinal(cleartext);
/*
* alice用aliceDesKey密钥解密
*/
Cipher aliceCipher = Cipher.getInstance("DES");
aliceCipher.init(Cipher.DECRYPT_MODE, aliceDesKey);
byte[] recovered = aliceCipher.doFinal(ciphertext);
System.out.println("alice解密bob的信息:"+(new String(recovered)));
if (!java.util.Arrays.equals(cleartext, recovered))
throw new Exception("解密后与原文信息不同");
System.out.println("解密后相同");
}
}
分享到:
相关推荐
适合Java新手的学习资源:介绍针对初学者设计的Spring Security学习资源,例如教程、视频课程或者书籍,并强调这些资源将如何帮助他们轻松入门并掌握关键概念。 学习收益:描述学习Spring Security的收益,例如提升...
三更springsecurity学习笔记
我们在使用SpringSecurity作为后台权限框架的时候,框架给我们提供了配置登录请求的接口,供我们配置登录链接,当我们配置了登录链接地址后,前端访问登陆请求的时候显示无权限。 异常分析 由于SpringSecurity的...
spring security的中文学习文档,很好用的
Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...
Spring Security 4.1 电子扫描版,仅供学习使用。
内容包含: 1、JAVA SE 2、MySQL + JDBC 3、JAVA WEB 4、Mybatis 5、SSM ...9、Spring Security 10、Shiro 11、Spring Cloud 12、JVM 13、JUC 14、Git 15、Linux 16、Redis 17、ElasticSearch 18、Docker
Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...
和spring集成使用的完美权限框架,学习java一定要学会spring_security
JAVA学习文档,包括了Security and Performance,OO,MultiMedia,JDK and JVM等方方面面,值得一看
主要介绍了详解springSecurity之java配置篇,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
JSSE(Java Security Socket Extension) 是Sun为了解决在Internet上的实现安全信息传输的解决方案。它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过...
该压缩包包含了java学习阶段的全部API帮助文档。有java api中英文版,Ajax_XMLHttpRequest帮助文档,Apache+Ant+1.7,Comm2.0_参考手册,DHTML_网页制作完全手册_中文,DHTML文档对象模型中文手册,DOS_练就高手,...
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...
Primarily based on Java 2 Enterprise Edition (J2EE) 1.2.1, Advanced JavaaA A 2 Platform How to Program integrates many technologies such as Extensible Markup Language (XML), JavaBeans, Security, Java ...
Java学习路线视频教程,大致包含:JVM、多线程、数据结构算法、计算机网络(TCP/IP HTTP HTTPS) SQL和数据库、操作系统、设计模式、IDEA Eclipse VSCode Linux Maven SVN Git SpringMVC Boot Security Shiro Redis ...
100多个初学者学习Java编程的实例集源代码,都是一些对学习Java十分有用的小程序,像applet小程序,graphics图形操作,print打印输出,security安全处理,thread线程,xml操作,gui等小程序源码,对学习Java是有一定...
该系统为Java分享学习网站。前端使用Html+CSS+JS实现,后端使用Java语言开发,使用Spring+SpringMVC+SpringBoot+MyBatis+PageHelper+MySQL+Maven实现,开发工具为Eclipse。该系统为Java分享学习网站。前端使用...
以下是Java学习书籍及建议的概述: 《Java编程思想》:这本书是Java编程的经典教材,适合初级和中级开发者。它全面介绍了Java编程的原理和方法,包括基础知识和面向对象编程。 《Java核心技术卷Ⅰ》:这是一本实用...
spring-security学习笔记和课件,欢迎学习爱好者下载资源,共同学习。。