码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • node将对象按照ASCII码进行升序排列生成签名字符串,然后加载 pfx证书进行SHA256withRSA加密


     GitHub - Dexus/pem: Create private keys and certificates with node.js

    安装 openSSL(v1.1.1) Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

    或者使用Chocolatey安装:choco install openssl(root权限)

    1. import * as pem from 'pem';
    2. import * as fs from 'fs';
    3. import * as NodeRSA from 'node-rsa';
    4. pem.config({
    5. pathOpenSSL: 'C:\\Program Files\\OpenSSL-Win64\\bin\\openssl'
    6. })
    7. async function createSign(obj) {
    8. const plaintext = getSignStr(obj);
    9. const privateKey = await readPem();
    10. return rsaSign(plaintext, privateKey, 'SHA256withRSA');
    11. }
    12. function getSignStr(obj) {
    13. const sortObj = sortASCII(obj,true);
    14. let singStr = ''
    15. for (const key in sortObj) {
    16. singStr += `${key}=${sortObj[key]}&`;
    17. }
    18. return singStr.slice(0, -1);
    19. }
    20. async function readPem() {
    21. const pfx = fs.readFileSync('C:/.../xx.pfx');
    22. return new Promise(async (resolve, reject) => {
    23. pem.readPkcs12(pfx, { p12Password: 'sumpay' }, (err, cert) => {
    24. console.log('err::: ', err);
    25. const RSAKey = cert.key;
    26. const key = new NodeRSA(RSAKey);
    27. const privateKey = key.exportKey("pkcs8");
    28. resolve(privateKey);
    29. });
    30. });
    31. }
    32. /**
    33. * 传入一个对象和布尔值,return根据ASCII码升序或者降序的对象
    34. * isSort: true代表升序,false代表降序
    35. * */
    36. function sortASCII(obj, isSort) {
    37. let arr = []
    38. Object.keys(obj).forEach(item => arr.push(item))
    39. let sortArr = isSort ? arr.sort() : arr.sort().reverse()
    40. let sortObj = {}
    41. for (let i in sortArr) {
    42. sortObj[sortArr[i]] = obj[sortArr[i]]
    43. }
    44. return sortObj
    45. }
    46. /**
    47. * rsa签名
    48. * @param content 签名内容
    49. * @param privateKey 私钥,PKCS#1
    50. * @param hash hash算法,SHA256withRSA,SHA1withRSA
    51. * @returns 返回签名字符串,base64
    52. */
    53. function rsaSign(content, privateKey, hash) {
    54. privateKey = _formatKey(privateKey)
    55. // 创建 Signature 对象
    56. const signature = new KJUR.crypto.Signature({
    57. alg: hash,
    58. //!这里指定 私钥 pem!
    59. prvkeypem: privateKey
    60. })
    61. signature.updateString(content)
    62. const signData = signature.sign()
    63. // 将内容转成base64
    64. return hextob64(signData)
    65. }
    66. function _formatKey(key) {
    67. if (!key.startsWith(PEM_BEGIN)) {
    68. key = PEM_BEGIN + key
    69. }
    70. if (!key.endsWith(PEM_END)) {
    71. key = key + PEM_END
    72. }
    73. return key
    74. }

  • 相关阅读:
    一文通透从输入URL到页面渲染的全过程----高频面试
    企业进行固定资产盘点的作用
    人工智能一种现代的方法 第四章 非经典搜索 上(局部搜索)
    网络协议--DNS:域名系统
    AXI协议详解(10)-非对齐传输
    2022最新调优、微服务、框架、分布式指南,我的“大厂”不是梦
    阿里云OSS上传文件超时 探测工具排查方法
    LabVIEW显示Unicode字符
    python opencv遍历每一个像素点
    MySQL中删除数据库中表格customer出现报错
  • 原文地址:https://blog.csdn.net/ycclydy/article/details/126509653
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号