`
no7beckham
  • 浏览: 95144 次
  • 性别: 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("解密后相同");

    }

}
分享到:
评论

相关推荐

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

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

    springsecurity学习笔记

    三更springsecurity学习笔记

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

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

    ss.rar_java security_spring security_springsecurity4xss

    spring security的中文学习文档,很好用的

    Spring Security OAuth2.0学习笔记.zip

    Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...

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

    Spring Security 4.1 电子扫描版,仅供学习使用。

    【狂神】JAVA学习全套笔记(完整版)

    内容包含: 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学习资料(源码)

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

    spring_security_3.1

    和spring集成使用的完美权限框架,学习java一定要学会spring_security

    JAVA学习文档

    JAVA学习文档,包括了Security and Performance,OO,MultiMedia,JDK and JVM等方方面面,值得一看

    详解springSecurity之java配置篇

    主要介绍了详解springSecurity之java配置篇,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java keytool安全证书学习

    JSSE(Java Security Socket Extension) 是Sun为了解决在Internet上的实现安全信息传输的解决方案。它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过...

    java学习阶段所有的API帮助文档

    该压缩包包含了java学习阶段的全部API帮助文档。有java api中英文版,Ajax_XMLHttpRequest帮助文档,Apache+Ant+1.7,Comm2.0_参考手册,DHTML_网页制作完全手册_中文,DHTML文档对象模型中文手册,DOS_练就高手,...

    JAVA上百实例源码以及开源项目源代码

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    Java高级教程PDF

    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开发学习路线.xmind

    Java学习路线视频教程,大致包含:JVM、多线程、数据结构算法、计算机网络(TCP/IP HTTP HTTPS) SQL和数据库、操作系统、设计模式、IDEA Eclipse VSCode Linux Maven SVN Git SpringMVC Boot Security Shiro Redis ...

    100多个Java基础学习实例集.rar

    100多个初学者学习Java编程的实例集源代码,都是一些对学习Java十分有用的小程序,像applet小程序,graphics图形操作,print打印输出,security安全处理,thread线程,xml操作,gui等小程序源码,对学习Java是有一定...

    Java+SpringBoot+MyBatis+Maven+MySQL实现的一个Java分享学习论坛

    该系统为Java分享学习网站。前端使用Html+CSS+JS实现,后端使用Java语言开发,使用Spring+SpringMVC+SpringBoot+MyBatis+PageHelper+MySQL+Maven实现,开发工具为Eclipse。该系统为Java分享学习网站。前端使用...

    java学习书籍及建议.docx

    以下是Java学习书籍及建议的概述: 《Java编程思想》:这本书是Java编程的经典教材,适合初级和中级开发者。它全面介绍了Java编程的原理和方法,包括基础知识和面向对象编程。 《Java核心技术卷Ⅰ》:这是一本实用...

    spring-security

    spring-security学习笔记和课件,欢迎学习爱好者下载资源,共同学习。。

Global site tag (gtag.js) - Google Analytics