使用java 进行数字签名-阿里云开发者社区

开发者社区> 黄威的世界> 正文

使用java 进行数字签名

简介:
+关注继续查看

使用Java 进行数字签名

签名算法有:

MD5withRSA

SHA1withRSA

SHA256withRSA

代码如下:

Java代码  收藏代码
  1. package com.common.enu;  
  2. /*** 
  3.  * 签名算法. 
  4.  * @author huangwei 
  5.  * @since 2013-10-28 
  6.  */  
  7. public enum SignatureAlgorithm {  
  8.     SIGNATURE_ALGORITHM_MD5withRSA("MD5withRSA"),  
  9.     SIGNATURE_ALGORITHM_SHA1withRSA("SHA1withRSA"),  
  10.     SIGNATURE_ALGORITHM_SHA256withRSA("SHA256withRSA");  
  11.       
  12.     private final String value;  
  13.   
  14.     //构造器默认也只能是private, 从而保证构造函数只能在内部使用  
  15.     private SignatureAlgorithm(String value) {  
  16.         this.value = value;  
  17.     }  
  18.       
  19.     public String getValue() {  
  20.         return value;  
  21.     }  
  22. }  
  23.   
  24. /** 
  25.      * use private key sign 
  26.      *  
  27.      * @param message 
  28.      *            data encrypted 
  29.      * @param key 
  30.      * @return 
  31.      * @throws Exception 
  32.      */  
  33.     public static byte[] sign(String message, PrivateKey key,  
  34.             SignatureAlgorithm algorithm) throws Exception {  
  35.         return SystemUtil.sign(message.getBytes(SystemUtil.CHARSET_ISO88591),  
  36.                 key, algorithm);  
  37.     }  
  38.   
  39. /** 
  40.      * use private key sign  
  41.      *  
  42.      * @param message 
  43.      * @param key 
  44.      * @return 
  45.      * @throws Exception 
  46.      */  
  47.     public static byte[] sign(byte[] message, PrivateKey key,  
  48.             SignatureAlgorithm algorithm) throws Exception {  
  49.         Signature signetcheck = Signature.getInstance(algorithm.getValue());  
  50.         signetcheck.initSign(key);  
  51.         signetcheck.update(message);  
  52.         return signetcheck.sign();  
  53.     }  
  54. /** 
  55.      * use public key verify sign 
  56.      *  
  57.      * @param message 
  58.      * @param signStr 
  59.      * @return 
  60.      * @throws Exception 
  61.      */  
  62.     public static boolean verifySign(byte[] message, byte[] signBytes,  
  63.             PublicKey key, SignatureAlgorithm algorithm) throws Exception {  
  64.         if (message == null || signBytes == null || key == null) {  
  65.             return false;  
  66.         }  
  67.         Signature signetcheck = Signature.getInstance(algorithm.getValue());  
  68.         signetcheck.initVerify(key);  
  69.         signetcheck.update(message);  
  70.         return signetcheck.verify(signBytes);  
  71.     }  
  72. public static boolean verifySign(byte[] message, String signStr,  
  73.             PublicKey key, SignatureAlgorithm algorithm) throws Exception {  
  74.         byte[] signBytes = toBytes(signStr);  
  75.         return verifySign(message, signBytes, key, algorithm);  
  76.     }  
  77. /*** 
  78.      * convert byte array to hex(16) bit string 
  79.      *  
  80.      * @param byte[] 
  81.      * @return hex(16) bit string 
  82.      */  
  83.     public static String toHexString(byte[] b) {  
  84.         StringBuilder sb = new StringBuilder(b.length * 2);  
  85.         for (int i = 0; i < b.length; i++) {  
  86.             sb.append(HEXCHAR[(b[i] & 0xf0) >>> 4]);  
  87.             sb.append(HEXCHAR[b[i] & 0x0f]);  
  88.         }  
  89.         return sb.toString();  
  90.     }  

 测试:

Java代码  收藏代码
  1. @Test  
  2.     public void test_sign() throws Exception {  
  3.         String message = "whuang3";  
  4.         SignatureAlgorithm algorithm = SignatureAlgorithm.SIGNATURE_ALGORITHM_SHA256withRSA;  
  5. //进行签名  
  6.         byte[] signResult = SystemUtil.sign(message, privateKey, algorithm);  
  7.         System.out.println("sign result hex:" + SystemUtil.toHexString(signResult));  
  8. //校验签名  
  9.         boolean isSuccess=SystemUtil.verifySign(message.getBytes(SystemUtil.CHARSET_ISO88591),  
  10.                 signResult, publicKey, algorithm);  
  11.         System.out.println("sign1 :"+isSuccess);  
  12.         Assert.assertEquals(isSuccess, true);  
  13.     }  

 参考:http://security.group.iteye.com/group/wiki/2280-Non-symmetric-encryption-Digital-Signature


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring Security笔记:使用数据库进行用户认证(form login using database)
在前一节,学习了如何自定义登录页,但是用户名、密码仍然是配置在xml中的,这样显然太非主流,本节将学习如何把用户名/密码/角色存储在db中,通过db来实现用户认证 一、项目结构 与前面的示例相比,因为要连接db,所以多出了一个spring-database.
871 0
使用分析函数进行行列转换
其实使用分析函数进行处理是很好的方式,翻一下Tom的书,将其中的一个例子收录在这里. 比如查询scott.emp表的用户SAL排序信息,可以使用如下查询: SQL> SELECT deptno, ename, 2 ROW_NUMBER () OVER (PARTITION BY ...
628 0
漫说数字签名digital signature(转载)
前提:公钥和私钥是成对的,它们互相解密。加密数据:公钥加密,私钥解密数字签名:私钥加密,公钥解密 一、漫说公钥与私钥原理 1)鲍勃有两把钥匙,一把是公钥,另一把是私钥 image 2)鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
1065 0
android 数字键盘使用
在android中,如果想调出键盘是数字的话,注意点。 一、只能输入1234567890的键盘integer只有数字输入,但是按回车键是没有任何反应的,不会跳到下一个输入框 二、decimal 此时,只能输入1234567890. 十位数字和一位小数点,如下图所示 但是按回车键是没有任何反应的,不会跳到下一个输入框 三、signed 此时输入法只能输入十位数字和一个负号“-” 小数点是不能输入的。
851 0
Silverlight中非对称加密及数字签名RSA算法的实现
RSA算法是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。
669 0
+关注
黄威的世界
我是一个热衷IT技术的人,希望自己不断地设计开发出对别人非常有用的软件。有近7年的java开发经验(包括2年Android开发经验)和一年左右的linux使用经验。擅长Java Web后台开发 ,喜欢研究新的各种实用技术
668
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载