添加可信时间戳,开启版权保护新模式

曾几何时,抄袭/盗版是一种不齿的行为,如今在互联网已经成为常态,肆无忌惮的盗用别人的劳动成果,绝对是“走别人的路,让别人无路可走”。

那么对于内容原创的创作者来说,如何进行自己作品的版权保护呢?一般可以通过如下2种方式:

1、 著作权,他是一个比较有效的版权保护方式,,属于主动保护自己的作品,费用一般在1500~3000,根据你申请时间长短来决定。

2、 使用时间戳,通过可信时间戳知识产权系统建立自己作品发表时间的法律证据,在遇到侵权行为时,进行作品保护,取证方便可靠,成本低,效率高!目前每个作品申请时间戳费用按文档大小收费哦。

接下来,就给大家介绍下,如何添加可信时间戳

首先,前往PDF在线处理平台:pdf365
在这里插入图片描述

然后点击“时间戳”图标,进入文档上传页,上传需要添加时间戳的PDF文档;
在这里插入图片描述

接着输入时间戳名称和服务区URL,点击“立即开始”按钮,即可开始PDF时间戳认证;
在这里插入图片描述

添加成功后,点击“下载”按钮,即可拿到认证后的文档;

好啦,今天的时间戳使用技巧就分享到这里,有需要进行版权保护的小伙伴,快来体验体验时间戳。

PDF在线压缩 PDF在线合并

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可信时间戳是指一种数字签名技术,可以证明某个数字签名是在特定的时间之前完成的。Java中可以使用Bouncy Castle库来实现可信时间戳功能。 以下是一个简单的Java代码示例,用于生成和验证可信时间戳: ```java import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Security; import java.security.cert.Certificate; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; import java.util.Date; import java.util.Hashtable; import java.util.Vector; import org.bouncycastle.asn1.ASN1ObjectIdentifier; import org.bouncycastle.asn1.cms.AttributeTable; import org.bouncycastle.asn1.cms.ContentInfo; import org.bouncycastle.asn1.cms.SignedData; import org.bouncycastle.asn1.cms.TimeStampToken; import org.bouncycastle.asn1.tsp.MessageImprint; import org.bouncycastle.asn1.tsp.TSTInfo; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.cms.CMSException; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.cms.CMSSignedDataGenerator; import org.bouncycastle.cms.CMSTypedData; import org.bouncycastle.cms.SignerInfoGenerator; import org.bouncycastle.cms.SignerInformation; import org.bouncycastle.cms.SignerInformationGenerator; import org.bouncycastle.cms.SignerInformationStore; import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder; import org.bouncycastle.operator.DigestAlgorithmIdentifierFinder; import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.operator.bc.BcDigestCalculatorProvider; import org.bouncycastle.operator.bc.BcRSAContentSignerBuilder; import org.bouncycastle.tsp.TSPException; import org.bouncycastle.tsp.TimeStampRequest; import org.bouncycastle.tsp.TimeStampRequestGenerator; import org.bouncycastle.tsp.TimeStampResponse; import org.bouncycastle.tsp.TimeStampTokenGenerator; public class TrustedTimestamp { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 输入要签名的数据 byte[] data = "Hello World".getBytes(); // 创建时间戳请求 TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator(); reqGen.setCertReq(true); byte[] digest = getMessageDigest(data); TimeStampRequest req = reqGen.generate( new ASN1ObjectIdentifier("1.2.840.113549.1.1.5"), digest); // 发送时间戳请求并接收响应 byte[] tsTokenBytes = getTimestampToken(req.getEncoded()); // 解析时间戳响应并验证签名 TimeStampToken tsToken = new TimeStampToken(new ContentInfo( SignedData.getInstance(tsTokenBytes))); if (tsToken.isSignatureValid(new SignerInformationStore( tsToken.getSignedContent() .getContentInfo() .getContentType(), tsToken.getSignedContent() .getContentInfo() .getContent()))) { System.out.println("Timestamp signature verified."); } else { System.out.println("Timestamp signature verification failed!"); } // 验证时间戳中的原文摘要值与输入数据的摘要值是否一致 TSTInfo tstInfo = tsToken.getTimeStampInfo().toTSTInfo(); if (MessageDigest.isEqual(digest, tstInfo.getMessageImprint() .getHashedMessage())) { System.out.println("Message digest verified."); } else { System.out.println("Message digest verification failed!"); } } private static byte[] getMessageDigest(byte[] data) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); return md.digest(data); } private static byte[] getTimestampToken(byte[] request) throws IOException, OperatorCreationException, CertificateEncodingException, TSPException { // 时间戳服务URL String url = "http://timestamp.comodoca.com/authenticode"; // 时间戳服务用户名 String username = "username"; // 时间戳服务密码 String password = "password"; // 创建时间戳请求对象 Hashtable<String, String> headers = new Hashtable<>(); headers.put("Content-Type", "application/timestamp-query"); headers.put("Authorization", "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes())); HttpTimestamper timestamper = new HttpTimestamper(url, headers); // 获取时间戳响应数据 TimeStampResponse response = timestamper.generateTimeStampResponse(request); // 提取时间戳令牌 TimeStampTokenGenerator tsTokenGen = new TimeStampTokenGenerator( new JcaSignerInfoGeneratorBuilder( new BcDigestCalculatorProvider()) .build(new BcRSAContentSignerBuilder( response.getTimeStampToken().getSignedData() .getDigestAlgorithm(), response.getTimeStampToken().getSignedData() .getEncapContentInfo() .getContentEncryptionAlgorithm()) .build(response.getTimeStampToken() .getSignerInfos() .getSigners() .iterator() .next() .getPrivateKey()))); tsTokenGen.setAccuracySeconds(1); tsTokenGen.setAccuracyMillis(0); tsTokenGen.setAccuracyMicros(0); tsTokenGen.setTSA(new X509Certificate[]{response.getTimeStampToken() .getCertificates()[0]}); return tsTokenGen.generate(new CMSProcessableByteArray(request), false).getEncoded(); } private static class HttpTimestamper { private final String url; private final Hashtable<String, String> headers; HttpTimestamper(String url, Hashtable<String, String> headers) { this.url = url; this.headers = headers; } TimeStampResponse generateTimeStampResponse(byte[] request) throws IOException, TSPException { byte[] response = post(url, request, headers); return new TimeStampResponse(response); } private static byte[] post(String url, byte[] data, Hashtable<String, String> headers) throws IOException { HttpURLConnection conn = (HttpURLConnection) new URL(url) .openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestProperty("Content-Type", headers.get("Content-Type")); for (String key : headers.keySet()) { if (!key.equalsIgnoreCase("Content-Type")) { conn.setRequestProperty(key, headers.get(key)); } } OutputStream out = conn.getOutputStream(); out.write(data); out.close(); InputStream in = conn.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[8192]; int count; while ((count = in.read(buffer)) != -1) { baos.write(buffer, 0, count); } in.close(); return baos.toByteArray(); } } } ``` 代码中通过Bouncy Castle库实现了时间戳的生成和验证。在生成时间戳的过程中,需要调用时间戳服务的API来获取时间戳响应数据,并将响应数据转换为时间戳令牌;在验证时间戳的过程中,需要校验时间戳令牌的签名和原文摘要值。 注意,为了使用Bouncy Castle库,需要在代码中添加以下语句: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; Security.addProvider(new BouncyCastleProvider()); ``` 同时,为了使用时间戳服务,需要替换代码中的时间戳服务URL、用户名和密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值