因为研究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 Security 的核心概念和技术细节,并将其应用于实际项目中,提高应用程序的安全性。 ### 结论 Java Security 是 Java 平台中一个极其重要的组成部分,特别是在 ...
根据提供的文件信息,本文将对《Expert Oracle and Java Security》一书进行深入解析,并提炼出与Oracle数据库安全及Java安全编程相关的关键知识点。 ### 关于本书 本书旨在为读者提供全面且深入的理解Oracle...
4. **安全管理器**:Java Security Manager是一个核心组件,用于实施运行时的安全策略。通过定制安全管理器,可以对应用程序的行为进行细致的控制,例如限制文件访问、网络通信等。 5. **权限与证书**:Java的权限...
以上只是Spring Security学习过程中的一部分要点,实际上,这个框架非常深奥,包含了许多高级特性,如频道安全、密码存储、国际化的错误消息等。在学习时,建议结合实际项目实践,这样能更好地理解和掌握其工作原理...
我们在使用SpringSecurity作为后台权限框架的时候,框架给我们提供了配置登录请求的接口,供我们配置登录链接,当我们配置了登录链接地址后,前端访问登陆请求的时候显示无权限。 异常分析 由于SpringSecurity的...
Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...
适合Java新手的学习资源:介绍针对初学者设计的Spring Security学习资源,例如教程、视频课程或者书籍,并强调这些资源将如何帮助他们轻松入门并掌握关键概念。 学习收益:描述学习Spring Security的收益,例如提升...
Java安全编程是开发健壮应用程序的关键部分,尤其是在处理敏感数据如用户密码、个人隐私或金融信息时。...通过学习"Java-Security_Program.pdf"这份资料,开发者可以增强对Java安全编程的理解,从而编写更安全的程序。
Spring Security 是 Java 开发中的一个强大且全面的安全框架,专为保护基于 Spring 的应用程序而设计。它提供了一整套的解决方案,包括身份验证、授权、会话管理以及防止常见攻击,如跨站脚本(XSS)、跨站请求伪造...
在IT行业中,安全是至关重要的一...通过阅读这份文档,开发者可以学习到如何设置Spring Security、配置安全策略以及解决登录过程中的各种安全问题。对于构建安全的Spring应用程序来说,这是一份非常有价值的参考资料。
本文将深入探讨如何使用CXF框架结合ws-security标准来实现对Java客户端调用Web服务的安全接口。CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于...
Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于 Java 的应用程序。它提供了全面的安全解决方案,包括Web安全、方法调用安全、API安全等多个方面。Spring Security的核心功能包括...
版本历史是学习框架的重要一环,Spring Security自2003年推出以来,经过多个版本的迭代和改进,功能不断完善。例如,Spring Security 4.1版本在安全性配置上有了显著的提升,尤其是在Web应用程序安全性和授权方面...
在IT行业中,`ws-security` 和 `java-mail` 是两个重要的技术领域,分别涉及Web服务安全和电子邮件处理。本文将详细探讨这两个领域的相关知识点,并结合提供的文件信息进行讲解。 首先,`ws-security`(Web ...
在IT行业中,安全是任何应用程序的核心组成部分,尤其是对于提供RESTful Web服务的...通过深入学习和实践这个项目,开发者可以提升自己在Java安全领域的专业技能,这对于任何涉及Web服务开发的职业生涯都是至关重要的。
SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、授权和访问控制功能。在本文中,我们将深入探讨SpringSecurity的核心概念、关键组件以及如何配置和使用这个框架。 首先,Spring...