首页 > 其他分享 >签名——SHA256-RSA2048

签名——SHA256-RSA2048

时间:2023-09-22 20:14:35浏览次数:29  
标签:java String RSA2048 签名 key signature import SHA256

生成私钥、公钥

$ openssl
OpenSSL>
OpenSSL>
OpenSSL> genrsa -out private_key.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
....................................+++++
......................................................+++++
e is 65537 (0x010001)
OpenSSL>
OpenSSL> rsa -in private_key.pem -pubout -out public_key.pem
writing RSA key
OpenSSL> exit

-rw-r--r-- 1 admin 197121 1702 Sep 22 08:16 private_key.pem

-rw-r--r-- 1 admin 197121  460 Sep 22 08:16 public_key.pem

 

应用私钥对待签名串进行SHA256-RSA2048签名,并对签名结果进行Base64编码得到签名值。

 

Java类


package com.utils;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

/**
 * SHA256RSA 签名、验签
 */
public class Sha256RsaUtil {

    public static String sign(byte[] privateKeyBytes, String data) throws Exception {
        // 读取私钥文件
        byte[] keyBytes = privateKeyBytes;
       
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
       
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
       
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

       
// 对数据进行 SHA256-RSA2048 签名
        Signature signature = Signature.getInstance("SHA256withRSA");
       
signature.initSign(privateKey);
       
signature.update(data.getBytes(StandardCharsets.UTF_8));
       
byte[] signBytes = signature.sign();

       
// 对签名结果进行 Base64 编码
        return Base64.getEncoder().encodeToString(signBytes);
   
}

    public static boolean verify(byte[] publicKeyBytes, String responseData, String byteSignature) throws Exception {
        // 读取公钥文件
        byte[] keyBytes = publicKeyBytes;
       
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
       
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
       
PublicKey publicKey = keyFactory.generatePublic(keySpec);

       
// 分割应答数据
        String[] responseParts = responseData.split("\n");
       
String responseTimestamp = responseParts[0];
       
String responseNonceStr = responseParts[1];
       
String responseBody = responseParts[2];

       
// 构造待验签数据
        String unsignedString = responseTimestamp + "\n" + responseNonceStr + "\n" + responseBody;

       
// 解码签名值
        byte[] signBytes = Base64.getDecoder().decode(byteSignature.getBytes());

       
// 验证签名
        Signature signature = Signature.getInstance("SHA256withRSA");
       
signature.initVerify(publicKey);
       
signature.update(unsignedString.getBytes(StandardCharsets.UTF_8));
       
return signature.verify(signBytes);
   
}

}



标签:java,String,RSA2048,签名,key,signature,import,SHA256
From: https://www.cnblogs.com/xingchong/p/17723236.html

相关文章

  • 苹果iOS签名主要有哪几种类型
    苹果iOS签名主要有以下三种类型:开发者签名(DeveloperSignature):开发者签名是由苹果公司为开发者提供的免费签名服务,用于测试和发布开发者自己的应用程序。根据苹果公司的规定,开发者必须拥有一个有效的开发者账户才能获得开发者签名。该签名的市场价格为零,因为它是免费提供的。个人......
  • 怎么制作手写电子签名?
    https://zhuanlan.zhihu.com/p/157419337年初在家办公,多次遇到需要在电子版文档上手写签名,以前的我习惯了打印出来再签字,但家里又没有打印机,可难倒了我…直到一个程序员朋友告诉了我几个傻瓜式操作方法,才发现手写电子签名也没那么难嘛。记得当时也去网上寻找解决方式,发现大家都......
  • JS实现电子签名,并且将带logo和时间水印的电子签名保存到本地
    页面效果如下 本地保存的电子签名图片如下 具体实现代码如下<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>电子签名</title><style>#canvas{border:1pxsolid#000;margin-bo......
  • 代码签名证书品牌哪家好?选微软推荐机构
    代码签名证书是保护软件代码完整性及来源可信的重要方式,软件程序要在操作系统中运行,就需要使用权威合规的代码签名证书,对软件代码进行数字签名,确保软件来源可信、未被非法篡改,消除操作系统“未知发布者”警告,让软件能够顺畅运行。众多代码签名证书厂商中,哪些厂商提供的代码签名证书......
  • 《流畅的Python》示例5-17 提取函数的签名
    理解param.kind含义:给形参传递参数的方式,是位置传递,还是关键字传递  1defclip(text,max_len=80):2end=None3iflen(text)>max_len:4space_before=text.rfind("",0,max_len)5ifspace_before>=0:6end......
  • itsdangerous:Python的签名和序列化库
    安装你可以从PyPI上直接安装这个库:pipinstallitsdangerous适用案例在取消订阅某个通讯时,你可以在URL里序列化并且签名一个用户的ID。这种情况下你不需要生成一个一次性的token并把它们存到数据库中。在任何的激活账户的链接或类似的情形下,同样适用。被签名的对象可以被存......
  • hmac:Python密码消息签名
    前言HMAC算法可以用于验证信息的完整性,这些信息可能在应用之间传递,或者存储在一个可能有安全威胁的地方。其基本思路:生成实际数据的一个密码散列,并提供一个共享的秘密密钥。然后使用得到的散列检查所传输或存储的信息,以确定一个信任级别,而不传输秘密密钥。消息签名hmac库提供......
  • 如何在iPhone手机端给IPA文件重签名?
    前语:IPA文件是iOS应用程序的安装包,通过对IPA文件进行重签名,我们可以在iPhone手机端实现应用的自定义安装。本文将介绍如何在手机端给IPA文件进行重签名的步骤和方法。第一步:准备工作在进行IPA文件重签名之前,我们需要准备以下工具和材料:一台Mac电脑:由于重签名涉及到iOS开发和......
  • 关于给APP打包签名加固重签名的过程
    背景首先我们想要自己开发的APP在别人手机上面安装的话,就需要进行打包,然后签名为了安全角度考虑,我们打开使用混淆规则,并且需要进行第三方加固第三方加固会删除我们原来的签名,所有需要重新签名,否则无法安装打包+签名创建签名或者使用已经存在的签名第三方加固我使用......
  • C#实现RSA加密与解密、签名与认证
    https://www.cnblogs.com/itjeff/p/8953308.html一、RSA简介RSA公钥加密算法是1977年由RonRivest、AdiShamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为......