package com.gg.test;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
public class TestSecurity {
public static void main(String[] args){
String caName="c:\\certificate.crt";
TestSecurity ts = new TestSecurity();
System.out.println("****读出数字证书******");
ts.readNormal(caName);
System.out.println("*****以字符串形式读出证书中得所有信息*****");
ts.readBin(caName);
}
//读出证书方法
public int readNormal(String caName){
try {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); //载入证书类型
InputStream is = new FileInputStream(caName);//输入文件
X509Certificate x509certificate =(X509Certificate) certFactory.generateCertificate(is);//解释输入文件
/*打印一系列信息*/
System.out.println( "类型: "+x509certificate.getType());//类型,此处为X.509
System.out.println( "版本: "+x509certificate.getVersion());//版本
System.out.println( "标题: "+x509certificate.getSubjectDN().getName());//标题
System.out.println( "得到开始的有效日期: "+x509certificate.getNotBefore().toString());//得到开始的有效日期
System.out.println( "得到截止的日期: "+x509certificate.getNotAfter().toString());//得到截止的日期
System.out.println( "得到序列号: "+x509certificate.getSerialNumber().toString(16));//得到序列号
System.out.println( "得到发行者名: "+x509certificate.getIssuerDN().getName());//得到发行者名
System.out.println( "得到签名算法: "+x509certificate.getSigAlgName());//得到签名算法
System.out.println( "得到公钥算法: "+x509certificate.getPublicKey().getAlgorithm());//得到公钥算法
is.close();//关闭流
} catch (Exception e) {
e.printStackTrace();
return -1;
}
return 0;
}
//以字符串形式读出证书中得所有信息
public int readBin(String caName){
try {
InputStream is = new FileInputStream(caName);
DataInputStream dis = new DataInputStream(is);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
byte[] bytes = new byte[dis.available()];
dis.readFully(bytes);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
while(bais.available()>0){
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(bais);
System.out.println(cert.toString());
}
is.close();
dis.close();
} catch (Exception e) {
e.printStackTrace();
return -1;
}
return 0;
}
/*
* 使用自签证书实例
*/
public static void crypt(byte[] cipherText,String file){
try {
//生成公钥
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
keyGen.init(56);
Key key = keyGen.generateKey();
//生成DES的Cipher
Cipher cdes =Cipher.getInstance("DES");
cdes.init(Cipher.ENCRYPT_MODE, key);
byte[] ct = cdes.doFinal(cipherText);
try {
//加密后的文件写回磁盘
FileOutputStream out = new FileOutputStream(file);
out.write(ct);
out.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* 把消息发送给CA进行消息签名,或者说生成数字证书
*/
public void signature(byte[] sigText,String file,String pswd,String keyStore,String alias){
char[] kpass;
int i;
try {
KeyStore ks = KeyStore.getInstance("JKS");
//keyStore默认为名字为.keyStore得隐藏文件,在用户的主目录下
BufferedInputStream ksbufin = new BufferedInputStream(new FileInputStream(keyStore));
//访问keyStore的密码
kpass = new char[pswd.length()];
for(i=0;i<pswd.length();i++){
kpass[i]= pswd.charAt(i);
};
ks.load(ksbufin,kpass);
//取得CA得私钥来进行数字签名
PrivateKey priv =(PrivateKey)ks.getKey(alias, kpass);
Signature rsa = Signature.getInstance("MD5withRSA");
rsa.initSign(priv);
rsa.update(sigText);
byte[] sig = rsa.sign();
System.out.println("sig is done");
try {
FileOutputStream out = new FileOutputStream(file);
out.write(sig);
out.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* 接收消息对数字证书进行验证
*/
public static void veriSignature(byte[] updateData,byte[] sigedText,String certName){
try {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
FileInputStream fin = new FileInputStream(certName);
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(fin);
//通过自签证书获得公钥
PublicKey pub = cert.getPublicKey();
Signature rsa = Signature.getInstance("MD5withRSA");
rsa.initVerify(pub);
rsa.update(updateData);
//验证
boolean verifies = rsa.verify(sigedText);
System.out.println("verified "+ verifies);
if(verifies){
System.out.println("Verify is done!");
}else{
System.out.println("verify is not successful");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
下面将详细介绍这些算法以及它们在Java中的实现,以及如何进行数字签名和数字证书的验证。 1. **SM2算法**:SM2是一种基于椭圆曲线密码学(ECC)的公钥加密算法,用于非对称加密。它提供了密钥交换、签名和验证的...
总结来说,这个项目涉及了Java中处理数字证书和使用RSA算法加密解密文件的关键技术。通过理解PFX文件的处理、密钥的提取、RSA加密解密原理以及测试代码的编写,开发者可以构建一个安全的文件加密系统,确保数据在...
【证书系统Java实现】 在B/S(Browser/Server)架构的系统中,数字签名功能是确保数据完整性和用户身份安全的重要一环。本话题聚焦于如何利用Java技术结合微软的CAPICOM(CryptoAPI Com的对象)控件来实现在浏览器...
EJBCA 是一个开源的 Public Key Infrastructure(PKI)系统,用于发放、管理数字证书。下面将详细阐述如何在 Java 中操作 EJBCA 证书进行加密和解密。 首先,你需要从 EJBCA 数据库中获取证书。这通常涉及到连接到 ...
在Android开发中,每个APK在发布前都需要通过一个数字证书进行签名,以证明应用的来源和完整性。一般情况下,开发者使用自己的私钥对应用进行签名。而“超级签名”则通常指的是通过特殊方式,使得应用无需用户手动...
EJBCA是一款功能强大的CA(Certification Authority)证书管理系统,专为实现全面的数字证书管理而设计。这款系统基于J2EE(Java 2 Platform, Enterprise Edition)架构,能够帮助用户构建自己的认证中心,从而在...
3. **免提示授权**:在某些情况下,开发者可能希望避免用户频繁的授权提示,这可以通过预设权限或者动态请求权限并在后台处理来实现。在Android中,可以通过在Manifest.xml中声明权限并使用运行时权限管理API来实现...
在这个系统中,Java主要负责业务逻辑处理和数据交互,通过Servlet和JavaBean实现服务器端的功能。Servlet是Java Web应用的核心组件,用于接收客户端请求,处理数据,并返回响应。JavaBean则封装了业务对象,提高了...
2. **签名验证**: 工行后台接收到转账请求及签名后,首先验证用户的密码是否正确,然后使用A的公钥对签名进行验证。 3. **操作确认**: 如果签名验证成功,则认为该操作是由用户A本人发起,从而允许转账操作继续进行...
在实际开发中,这些支付方式的集成往往需要考虑异常处理、支付状态的实时同步、退款功能、以及与后台数据库的交互等。同时,为了保证支付安全,需要对敏感信息进行加密处理,防止数据泄露。此外,良好的日志记录和...
J2EE(Java 2 Platform, Enterprise Edition)平台提供了丰富的安全特性,其中数字证书认证系统就是一种常用的安全机制。本文将深入探讨一套名为“j2ee_cert”的J2EE数字证书认证系统,它涵盖了证书的申请、发放、...
这些组件可以帮助开发者实现数据加密、数字签名、证书管理以及网络安全通信等功能,为电子商务系统提供了坚实的安全基础。 1. **Java安全模型**:Java安全模型通过类加载器和访问控制器来限制代码的权限,防止恶意...
你需要在这里处理通知,例如显示横幅、弹出提醒或执行特定的后台任务。 四、推送策略和优化 1. 消息分发:确保只向活跃用户发送推送,避免无效推送浪费资源。 2. 推送消息格式:优化payload的大小,避免超过APNs...
3. **数字签名与证书**:Java支持数字签名和X.509证书,用于身份验证和数据完整性检查。这在电子商务交易中至关重要,防止了冒名顶替和数据篡改。 4. **HTTPS与SSL/TLS协议**:Java标准库包含了对HTTPS的支持,这是...
在iOS平台上,推送通知是一种非常重要的功能,它允许应用程序在后台状态下向用户发送消息。本文主要探讨了如何基于Java实现iOS的推送通知。首先,我们需要理解iOS推送通知的基本原理。 **iOS推送通知原理** 1. **...
身份认证包括用户的身份验证和信息的真实性验证,常用的有密码认证、数字证书认证等。信息认证则确保信息在传输过程中不被篡改。此外,认证机构的参与进一步增强了信任度。 【Go 2008电子商务系统】 Go 2008电子...
- **签名**:使用数字证书对APK进行签名。 - **发布**:上传至Google Play商店或其他应用市场。 通过以上知识点的总结,《学习Java用于Android开发》第二版不仅提供了Java编程的基础知识,还深入介绍了如何利用Java...
1. **认证机制**:支持多种认证方式,如用户名密码、数字证书、OAuth等。 2. **角色与权限**:定义用户角色,分配不同角色的访问权限,实现细粒度的权限控制。 3. **会话管理**:有效管理用户的会话,防止会话劫持和...
`javapns2.2`包含了处理证书、构建和发送推送消息所需的所有功能。 三、准备环境 1. 获取Apple开发者账号:你需要拥有一个Apple开发者账号,以便生成APNs证书。 2. 创建推送证书:在Apple Developer Portal中,为...