`
no7beckham
  • 浏览: 97177 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA SECURITY学习

    博客分类:
  • JAVA
阅读更多
因为研究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("解密后相同");

    }

}
分享到:
评论

相关推荐

    深入理解Android之Java Security

    通过学习这些类的源码,开发者可以更好地掌握 Java Security 的核心概念和技术细节,并将其应用于实际项目中,提高应用程序的安全性。 ### 结论 Java Security 是 Java 平台中一个极其重要的组成部分,特别是在 ...

    expert oracle and java security

    根据提供的文件信息,本文将对《Expert Oracle and Java Security》一书进行深入解析,并提炼出与Oracle数据库安全及Java安全编程相关的关键知识点。 ### 关于本书 本书旨在为读者提供全面且深入的理解Oracle...

    java security handbook

    4. **安全管理器**:Java Security Manager是一个核心组件,用于实施运行时的安全策略。通过定制安全管理器,可以对应用程序的行为进行细致的控制,例如限制文件访问、网络通信等。 5. **权限与证书**:Java的权限...

    springsecurity学习笔记

    以上只是Spring Security学习过程中的一部分要点,实际上,这个框架非常深奥,包含了许多高级特性,如频道安全、密码存储、国际化的错误消息等。在学习时,建议结合实际项目实践,这样能更好地理解和掌握其工作原理...

    java学习之SpringSecurity配置了登录链接无权限

    我们在使用SpringSecurity作为后台权限框架的时候,框架给我们提供了配置登录请求的接口,供我们配置登录链接,当我们配置了登录链接地址后,前端访问登陆请求的时候显示无权限。 异常分析 由于SpringSecurity的...

    SpringSecurity学习资源文档+适合Java新手

    适合Java新手的学习资源:介绍针对初学者设计的Spring Security学习资源,例如教程、视频课程或者书籍,并强调这些资源将如何帮助他们轻松入门并掌握关键概念。 学习收益:描述学习Spring Security的收益,例如提升...

    Java-Security_Program.zip_java security

    Java安全编程是开发健壮应用程序的关键部分,尤其是在处理敏感数据如用户密码、个人隐私或金融信息时。...通过学习"Java-Security_Program.pdf"这份资料,开发者可以增强对Java安全编程的理解,从而编写更安全的程序。

    ss.rar_java security_spring security_springsecurity4xss

    Spring Security 是 Java 开发中的一个强大且全面的安全框架,专为保护基于 Spring 的应用程序而设计。它提供了一整套的解决方案,包括身份验证、授权、会话管理以及防止常见攻击,如跨站脚本(XSS)、跨站请求伪造...

    application-sexurity.zip_java security_spring security

    在IT行业中,安全是至关重要的一...通过阅读这份文档,开发者可以学习到如何设置Spring Security、配置安全策略以及解决登录过程中的各种安全问题。对于构建安全的Spring应用程序来说,这是一份非常有价值的参考资料。

    纯java调用ws-security+CXF实现的webservice安全接口

    本文将深入探讨如何使用CXF框架结合ws-security标准来实现对Java客户端调用Web服务的安全接口。CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于...

    最详细Spring Security学习资料(源码)

    Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...

    Spring Security 学习总结1_3

    Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于 Java 的应用程序。它提供了全面的安全解决方案,包括Web安全、方法调用安全、API安全等多个方面。Spring Security的核心功能包括...

    Spring Security 4.1 中文文档@www.java1234.com.pdf

    版本历史是学习框架的重要一环,Spring Security自2003年推出以来,经过多个版本的迭代和改进,功能不断完善。例如,Spring Security 4.1版本在安全性配置上有了显著的提升,尤其是在Web应用程序安全性和授权方面...

    ws-security java-mail

    在IT行业中,`ws-security` 和 `java-mail` 是两个重要的技术领域,分别涉及Web服务安全和电子邮件处理。本文将详细探讨这两个领域的相关知识点,并结合提供的文件信息进行讲解。 首先,`ws-security`(Web ...

    REST-spring-security.rar_java rest_java security_rest_rest secu

    在IT行业中,安全是任何应用程序的核心组成部分,尤其是对于提供RESTful Web服务的...通过深入学习和实践这个项目,开发者可以提升自己在Java安全领域的专业技能,这对于任何涉及Web服务开发的职业生涯都是至关重要的。

    SpringSecurity学习总结源代码

    SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、授权和访问控制功能。在本文中,我们将深入探讨SpringSecurity的核心概念、关键组件以及如何配置和使用这个框架。 首先,Spring...

Global site tag (gtag.js) - Google Analytics