`
sping_
  • 浏览: 6835 次
社区版块
存档分类
最新评论

saml 数字签名校验

    博客分类:
  • java
 
阅读更多
private String publicKey;  
44.    private String privateKey;  
45. 
46.    @Before 
47.    public void setUp() throws Exception {  
48.        Map<String, Object> keyMap = RSACoder.initKey();  
49. 
50.        publicKey = RSACoder.getPublicKey(keyMap);  
51.        privateKey = RSACoder.getPrivateKey(keyMap);  
52.        System.err.println("公钥: \n\r" + publicKey);  
53.        System.err.println("私钥: \n\r" + privateKey);  
54.    }  
55. 
56.    @Test 
57.    public void test() throws Exception {  
58.        System.err.println("公钥加密——私钥解密");  
59.        String inputStr = "abc";  
60.        byte[] data = inputStr.getBytes();  
61.        byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);  
62.        byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData, privateKey);  
63. 
64.        String outputStr = new String(decodedData);  
65.        System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);  
66.        assertEquals(inputStr, outputStr);  
67. 
68.    }  
69. 
70.    @Test 
71.    public void testSign() throws Exception {  
72.        System.err.println("私钥加密——公钥解密");  
73.        String inputStr = "sign";  
74.        byte[] data = inputStr.getBytes();  
75.        byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);  
76.        byte[] decodedData = RSACoder.decryptByPublicKey(encodedData, publicKey);  
77. 
78.        String outputStr = new String(decodedData);  
79.        System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);  
80.        assertEquals(inputStr, outputStr);  
81. 
82.        System.err.println("私钥签名——公钥验证签名");  
83.        // 产生签名  
84.        String sign = RSACoder.sign(encodedData, privateKey);  
85.        System.err.println("签名:\r" + sign);  
86. 
87.        // 验证签名  
88.        boolean status = RSACoder.verify(encodedData, publicKey, sign);  
89.        System.err.println("状态:\r" + status);  
90.        assertTrue(status);  
91. 
92.    }  
93. 
94.}  
95. 
96.abstract class RSACoder extends Coder {  
97.    public static final String KEY_ALGORITHM = "RSA";  
98.    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";  
99. 
100.    private static final String PUBLIC_KEY = "RSAPublicKey";  
101.    private static final String PRIVATE_KEY = "RSAPrivateKey";  
102. 
103.    /** 
104.     * 用私钥对信息生成数字签名 
105.     *  
106.     * @param data 
107.     *            加密数据 
108.     * @param privateKey 
109.     *            私钥 
110.     *  
111.     * @return 
112.     * @throws Exception 
113.     */ 
114.    public static String sign(byte[] data, String privateKey) throws Exception {  
115.        // 解密由base64编码的私钥  
116.        byte[] keyBytes = decryptBASE64(privateKey);  
117. 
118.        // 构造PKCS8EncodedKeySpec对象  
119.        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);  
120. 
121.        // KEY_ALGORITHM 指定的加密算法  
122.        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);  
123. 
124.        // 取私钥匙对象  
125.        PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);  
126. 
127.        // 用私钥对信息生成数字签名  
128.        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);  
129.        signature.initSign(priKey);  
130.        signature.update(data);  
131. 
132.        return encryptBASE64(signature.sign());  
133.    }  
134. 
135.    /** 
136.     * 校验数字签名 
137.     *  
138.     * @param data 
139.     *            加密数据 
140.     * @param publicKey 
141.     *            公钥 
142.     * @param sign 
143.     *            数字签名 
144.     *  
145.     * @return 校验成功返回true 失败返回false 
146.     * @throws Exception 
147.     *  
148.     */ 
149.    public static boolean verify(byte[] data, String publicKey, String sign)  
150.            throws Exception {  
151. 
152.        // 解密由base64编码的公钥  
153.        byte[] keyBytes = decryptBASE64(publicKey);  
154. 
155.        // 构造X509EncodedKeySpec对象  
156.        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);  
157. 
158.        // KEY_ALGORITHM 指定的加密算法  
159.        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);  
160. 
161.        // 取公钥匙对象  
162.        PublicKey pubKey = keyFactory.generatePublic(keySpec);  
163. 
164.        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);  
165.        signature.initVerify(pubKey);  
166.        signature.update(data);  
167. 
168.        // 验证签名是否正常  
169.        return signature.verify(decryptBASE64(sign));  
170.    }  
171. 
172.    /** 
173.     * 解密<br> 
174.     * 用私钥解密 http://www.5a520.cn http://www.feng123.com 
175.     *  
176.     * @param data 
177.     * @param key 
178.     * @return 
179.     * @throws Exception 
180.     */ 
181.    public static byte[] decryptByPrivateKey(byte[] data, String key)  
182.            throws Exception {  
183.        // 对密钥解密  
184.        byte[] keyBytes = decryptBASE64(key);  
185. 
186.        // 取得私钥  
187.        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);  
188.        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);  
189.        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);  
190. 
191.        // 对数据解密  
192.        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());  
193.        cipher.init(Cipher.DECRYPT_MODE, privateKey);  
194. 
195.        return cipher.doFinal(data);  
196.    }  
197. 
198.    /** 
199.     * 解密<br> 
200.     * 用私钥解密 
201.     *  
202.     * @param data 
203.     * @param key 
204.     * @return 
205.     * @throws Exception 
206.     */ 
207.    public static byte[] decryptByPublicKey(byte[] data, String key)  
208.            throws Exception {  
209.        // 对密钥解密  
210.        byte[] keyBytes = decryptBASE64(key);  
211. 
212.        // 取得公钥  
213.        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);  
214.        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);  
215.        Key publicKey = keyFactory.generatePublic(x509KeySpec);  
216. 
217.        // 对数据解密  
218.        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());  
219.        cipher.init(Cipher.DECRYPT_MODE, publicKey);  
220. 
221.        return cipher.doFinal(data);  
222.    }  
223. 
224.    /** 
225.     * 加密<br> 
226.     * 用公钥加密 
227.     *  
228.     * @param data 
229.     * @param key 
230.     * @return 
231.     * @throws Exception 
232.     */ 
233.    public static byte[] encryptByPublicKey(byte[] data, String key)  
234.            throws Exception {  
235.        // 对公钥解密  
236.        byte[] keyBytes = decryptBASE64(key);  
237. 
238.        // 取得公钥  
239.        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);  
240.        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);  
241.        Key publicKey = keyFactory.generatePublic(x509KeySpec);  
242. 
243.        // 对数据加密  
244.        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());  
245.        cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
246. 
247.        return cipher.doFinal(data);  
248.    }  
249. 
250.    /** 
251.     * 加密<br> 
252.     * 用私钥加密 
253.     *  
254.     * @param data 
255.     * @param key 
256.     * @return 
257.     * @throws Exception 
258.     */ 
259.    public static byte[] encryptByPrivateKey(byte[] data, String key)  
260.            throws Exception {  
261.        // 对密钥解密  
262.        byte[] keyBytes = decryptBASE64(key);  
263. 
264.        // 取得私钥  
265.        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);  
266.        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);  
267.        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);  
268. 
269.        // 对数据加密  
270.        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());  
271.        cipher.init(Cipher.ENCRYPT_MODE, privateKey);  
272. 
273.        return cipher.doFinal(data);  
274.    }  
275. 
276.    /** 
277.     * 取得私钥 
278.     *  
279.     * @param keyMap 
280.     * @return 
281.     * @throws Exception 
282.     */ 
283.    public static String getPrivateKey(Map<String, Object> keyMap)  
284.            throws Exception {  
285.        Key key = (Key) keyMap.get(PRIVATE_KEY);  
286. 
287.        return encryptBASE64(key.getEncoded());  
288.    }  
289. 
290.    /** 
291.     * 取得公钥 
292.     *  
293.     * @param keyMap 
294.     * @return 
295.     * @throws Exception 
296.     */ 
297.    public static String getPublicKey(Map<String, Object> keyMap)  
298.            throws Exception {  
299.        Key key = (Key) keyMap.get(PUBLIC_KEY);  
300. 
301.        return encryptBASE64(key.getEncoded());  
302.    }  
303. 
304.    /** 
305.     * 初始化密钥 
306.     *  
307.     * @return 
308.     * @throws Exception 
309.     */ 
310.    public static Map<String, Object> initKey() throws Exception {  
311.        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);  
312.        keyPairGen.initialize(1024);  
313. 
314.        KeyPair keyPair = keyPairGen.generateKeyPair();  
315. 
316.        // 公钥  
317.        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  
318. 
319.        // 私钥  
320.        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  
321. 
322.        Map<String, Object> keyMap = new HashMap<String, Object>(2);  
323. 
324.        keyMap.put(PUBLIC_KEY, publicKey);  
325.        keyMap.put(PRIVATE_KEY, privateKey);  
326.        return keyMap;  
327.    }  
328.} 


示例2
【例:校验数字签名】

    /**
    * @(#) VerifySign.java
    */
    import java.io.*;
    import java.security.*;
    import java.security.spec.*;
    class VerifySign{
    public static void main(String[] args){
    if (args.length != 3){
        System.out.println(
        "Usage: VerifySign 
        ");
        System.out.println("Options:");
        System.out.println(":The file name of the public key.");
        System.out.println(": The file name that want to signature.");
        System.out.println(": The file name containing signature data.");
        System.out.println("Examples:");
        System.out.println("   java Verifysign Publickey-my info.txt Sign-my");
        System.exit(0);
    }
    try{
        //从文件得到编码公钥字节
        FileInputStream fileIn = new FileInputStream(args[0]);
        //已编码的公钥字节
        byte[] encodedpubkey = new byte[fileIn.available()];
        fileIn.read(encodedpubkey);
        fileIn.close();
        //用编码公钥字节创建一个X509EncodedkeySpec对象
        X509EncodedkeySpec pubkeySpec =
        new X509ExcodedkeySpec(encodedpubkey);
        //使用DSA算法创建一个keyFactory对象
        keyFactory keyFactory = keyFactory.getInstance("DSA");
        //用公钥规范生成一个公钥对象
        PublicKey pubkey = keyFactory.generatePublic(pubkeySpec);
        //从文件中得到数字签名
        FileInputStream sigStream = new FileInputStream(args[2]);
        Byte[] signature = new byte[sigStream.available()];
        SigStream.read(signature);
        SigStream.close();
        //创建数字签名对象
        Signature sigObj = Signature.getInstance("SHAlwithDSA");
        //初始化Signature对象,以便用公钥检验
        sigObj.initVerify(pubkey);
        foleIn = new FoleInputStream(args[1]);
        byte b;
        while (fileIn.available() != 0){
            b = (byte) fileIn.read();
            sigObj.update(b);
        };
        fileIn.close();
        Boolean verifies = sigObj.verify(signature);
        System.out.puintln("sognature verifies:" + verifies);
    }catch (Exception e) {System.err.puintln("" + e);
        }
    }
    }

分享到:
评论

相关推荐

    SAML.rar_Java 8_saml_saml webservice_saml2.0_saml协议

    1、什么是SAML 2、SAML标准&协议 3、SAML2.0特性分析 4、SAML:集中身份管理的秘诀 5、SAML:企业级的IdP 6、SAML:IdP和SP用户存储库 7、XML安全:使用SAML确保可移植的信任 8、揭开SAML的神秘面纱 9、安全地共享...

    samlsigtest:演示SAML响应解码和XML签名验证的简单项目

    它通过数字签名技术确保数据在传输过程中未被修改,并能验证发送者的身份。 4. **Java XML Security**:Java提供了一套XML安全API,包括XML加密(XML Encryption)和XML签名(XML Signature),用于处理XML安全相关...

    saml-client_java_saml_client_

    - `SignatureSigningParameters` 和 `SignatureValidator`: 处理SAML消息的数字签名,确保其完整性和来源的可信性。 为了实现一个SAML客户端,你需要配置SAML元数据,这包含了SP和IdP的相关信息,如实体ID、证书和...

    SAML2.0核心协议规范saml-core-2.0-os

    4. 安全特性:SAML规范包含安全方面的考虑,例如如何对断言进行数字签名和加密以确保其完整性、机密性和不可否认性。 5. 实体和角色:SAML定义了几个关键实体角色,包括: - 主体(Subject):代表被声明的用户或...

    SAML2完整规范

    1. **安全性**:使用数字签名和加密技术确保数据的安全传输。 2. **互操作性**:基于开放标准,不同供应商的系统可以无缝集成。 3. **灵活性**:支持多种认证方式,如密码、证书、多因素认证等。 4. **可扩展性**:...

    saml协议所需jar包

    4. **XML解析与签名验证**: SAML基于XML格式,因此JAR包中可能还包括了XML解析器(如Xerces或Woodstox)和XML签名验证库(如Apache Santuario)。这些库用于确保SAML消息的正确性和安全性,防止中间人攻击。 5. **...

    SAML2.0协议翻译.doc

    - **安全机制**:SAML支持数字签名和加密,确保数据完整性和隐私。 OpenSAML是开源的Java库,用于处理SAML 2.0消息和对象,它为开发者提供了处理SAML断言、构建和解析SAML请求和响应的工具。 SAML 2.0的优点在于它...

    saml-profiles-2.0-os

    3. **安全实践和策略**:SAML 2.0 Profiles还详细阐述了与安全相关的实践和策略,包括但不限于数字签名、加密、身份验证方法的选择等。 #### 六、编辑者及贡献者 - **编辑者**:John Hughes (Atos Origin), Scott ...

    saml第三方资料.rar

    6. **SAML的XML签名和加密**:为了确保SAML消息的安全性,SAML2.0支持XML签名和加密,确保数据的完整性和机密性。签名可以验证消息来源的合法性,而加密则保护敏感数据不被未授权的用户访问。 7. **SAML断言**:...

    Laravel开发-laravel-saml

    SAML 2.0 提供了强大的安全性特性,如数字签名、加密和时间戳,确保了通信的安全性。然而,开发者仍需注意潜在的安全风险,如中间人攻击。因此,正确配置SSL/TLS证书和安全存储私钥至关重要。 总之,`laravel-saml`...

    SAML v2.0 开发指南 SSO必备

    SAML(安全断言标记语言)v2.0是一种开放标准,用于实现Web浏览器中的单点登录(SSO)。SAML提供了一种机制,允许用户通过使用现有的身份验证凭证从一个地方安全地访问多个应用程序。这种方式可以改善用户体验并降低...

    redmine_saml-源码.rar

    - SAML签名和加密是保障数据安全的关键,源码中应正确处理这些环节,防止中间人攻击。 - 确保插件及时更新,防止已知漏洞被利用。 7. **调试与日志** - 分析源码时,日志记录对排查问题至关重要,了解如何开启和...

    python-saml-master

    6. **处理SAML响应**:IdP将发送回一个SAML响应,你的应用需要验证响应的签名和状态,然后根据响应中的信息进行用户会话的创建或更新。 通过"python-saml-master"库,你可以高效且安全地在Python应用中实施SAML身份...

    SAML2.0 基础理论

    SAML(Security Assertion Markup Language)2.0是一种开放标准,由标识化组织OASIS提出,旨在解决数字身份验证和单点登录(Single Sign-On, SSO)的问题。SAML2.0旨在提高Web服务的安全性和互操作性,让用户能够在...

    saml2.0规范完全文档

    SAML(Security Assertion Markup Language)2.0是一个开放标准,用于在不同的安全域之间交换身份验证和授权数据。这个标准由OASIS(Organization for the Advancement of Structured Information Standards)组织...

    spring-boot-security-saml-sample:SBS3 —基于Spring Boot构建的示例SAML 2.0服务提供程序

    [SBS3] Spring Boot示例SAML 2.0服务提供程序项目描述该项目代表完全基于Spring Framework构建的SAML 2.0 Service Provider的示例实现。 特别是,它展示了如何通过集成Spring Boot和Spring Security SAML开发为联合...

    SAML的标准与协议

    SAML(Security Assertion Markup Language)是由OASIS组织制定的一种标准,主要目的是在不同系统和服务之间安全地交换用户的标识信息,实现单点登录(Single Sign-On, SSO)。在SAML出现之前,若要在诸如Websphere...

    SAML文档详细介绍.pdf

    ### SAML:安全断言标记语言详解 #### 一、SAML概述 SAML,全称为Security Assertion Markup Language,即安全断言标记语言,是一种基于XML的开放标准,旨在简化跨域的身份验证和授权流程。SAML最初由OASIS...

    SAML v2 and XACML v2 Integration

    在IT领域,特别是针对身份管理和访问控制方面,SAML(Security Assertion Markup Language)与XACML(eXtensible Access Control Markup Language)是两个至关重要的标准。本文将深入探讨SAML v2与XACML v2在JBoss...

    Learning SAML

    《学习SAML:身份验证与单点登录的基石》 SAML(Security Assertion Markup Language,安全断言标记语言)是一种开放标准,用于在不同的信任域之间交换身份验证和授权数据。它在现代Web应用程序和企业级系统中扮演...

Global site tag (gtag.js) - Google Analytics