小程序 uniapp使用 base64加密 和SHA256算法 对其加密

SHA256算法

小程序项目需要引用腾讯的api,但是有个签名规则需要进行SHA256算法 对其加密,将生成的签名串(字节数组)使用 Base64 编码,即可获得最终的签名串,自己项目中就只用到了cryptoJS 中的AES加密,没有用到SHA256算法
所以就需要自己在去整一份加密方式

最简单前端使用SHA256

1.使用npm安装 :npm install js-sha256
import { sha256 } from ‘js-sha256’ 或者 let sha256 = require(“js-sha256”).sha256//目录文件vue中引用
let newsha256 = sha256(“数据”)//要加密的数据

Base64 编码

浏览器上使用Base64 编码

window.atob()与window.btoa
Window.atob():函数用来解码一个已经被base-64编码过的数据
window.btoa():将ascii字符串或二进制数据转换成一个base64编码过的字符串

小程序使用Base64 编码

因为不支持window对象所以得要自己写个js去进行编码转换
然后直接引用就是中的weBtoa 和weAtob 功能如浏览器上的一样

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
exports.weBtoa = function (string) {
    string = String(string);
    var bitmap, a, b, c, result = "", i = 0, rest = string.length % 3;
    for (; i < string.length;) {
        if ((a = string.charCodeAt(i++)) > 255 ||
            (b = string.charCodeAt(i++)) > 255 ||
            (c = string.charCodeAt(i++)) > 255)
            throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.");
        bitmap = (a << 16) | (b << 8) | c;
        result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) +
            b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63);
    }
    return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result;
};
exports.weAtob = function (string) {
    string = String(string).replace(/[\t\n\f\r ]+/g, "");
    if (!b64re.test(string))
        throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");
    string += "==".slice(2 - (string.length & 3));
    var bitmap, result = "", r1, r2, i = 0;
    for (; i < string.length;) {
        bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 |
            (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++)));
        result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) :
            r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) :
                String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
    }
    return result;
};
function b64DecodeUnicode(str) {
    return decodeURIComponent(exports.weAtob(str).replace(/(.)/g, function (p) {
        var code = p.charCodeAt(0).toString(16).toUpperCase();
        if (code.length < 2) {
            code = "0" + code;
        }
        return "%" + code;
    }));
}
function base64_url_decode(str) {
    var output = str.replace(/-/g, "+").replace(/_/g, "/");
    switch (output.length % 4) {
        case 0:
            break;
        case 2:
            output += "==";
            break;
        case 3:
            output += "=";
            break;
        default:
            throw "Illegal base64url string!";
    }
    try {
        return b64DecodeUnicode(output);
    }
    catch (err) {
        return exports.weAtob(output);
    }
}
function weappJwtDecode(token, options) {
    if (typeof token !== "string") {
        throw ("Invalid token specified");
    }
    options = options || {};
    var pos = options.header === true ? 0 : 1;
    try {
        return JSON.parse(base64_url_decode(token.split(".")[pos]));
    }
    catch (e) {
        throw ("Invalid token specified: " + e.message);
    }
}
exports.default = weappJwtDecode;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,使用 Java 加密算法对电子票进行加密签名,可以使用 Java Cryptography Architecture (JCA) 提供的 API。 一般情况下,进行加密签名的流程如下: 1. 生成密钥对。使用 KeyPairGenerator 类生成密钥对,其中包括公钥和私钥。 2. 获取待加密的数据。这里我们假设电子票已经生成并保存在一个字符串中。 3. 对待加密的数据进行加密使用 Cipher 类对待加密的数据进行加密,其中需要指定加密算法和密钥。 4. 对加密后的数据进行签名。使用 Signature 类对加密后的数据进行签名,其中需要指定签名算法和私钥。 5. 将签名和加密后的数据返回。 下面是一个简单的示例代码: ```java import java.security.*; import javax.crypto.*; import java.util.Base64; public class EncryptAndSign { public static void main(String[] args) throws Exception { // 生成密钥对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); // 待加密的数据 String plainText = "电子票内容"; // 对待加密的数据进行加密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encrypted = cipher.doFinal(plainText.getBytes()); // 对加密后的数据进行签名 Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(encrypted); byte[] signatureBytes = signature.sign(); // 将签名和加密后的数据返回 String encryptedText = Base64.getEncoder().encodeToString(encrypted); String signatureText = Base64.getEncoder().encodeToString(signatureBytes); System.out.println("加密后的数据:" + encryptedText); System.out.println("签名:" + signatureText); } } ``` 上面的代码使用 RSA 算法对电子票进行加密签名。具体流程如下: 1. 使用 RSA 算法生成了一个 2048 位的密钥对。 2. 将电子票内容保存在一个字符串中。 3. 使用 RSA 算法对电子票进行加密使用公钥进行加密。 4. 使用 SHA256withRSA 算法加密后的数据进行签名,使用私钥进行签名。 5. 将加密后的数据和签名分别转换为 Base64 编码的字符串,并输出。 需要注意的是,上面的示例代码只是一个简单的示例,实际应用中还需要加入异常处理、错误处理等代码。另外,使用 RSA 算法对数据进行加密签名时,需要考虑密钥的管理和存储等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值