my.rsa(object object)
以 promise 风格调用: 不支持 。
主体: 企业支付宝小程序 、 个人支付宝小程序
相关文档: 支付宝开放平台开发助手
my.rsa 提供 rsa 加解密能力。
rsa(非对称加密)使用的加密密钥(公钥)与解密密钥(私钥)不同,公钥是公开信息,私钥需要保密。
请在小程序运行环境使用公钥进行加密,在服务端使用私钥进行解密(可点此查看示例)。私钥请保存在服务端(若私钥放在客户端,容易泄露而导致安全问题)。
可使用 支付宝开放平台开发助手 生成密钥对。
object object
查看示例
属性 | 类型 | 描述 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
action | string | 使用 rsa 加密还是 rsa 解密。 | ||||||||||
| ||||||||||||
text | string | 算法输入。加密时传入明文,解密时传入密文(base64 编码)。rsa key 为 1024 位时,最多支持 117 个字节;rsa key 为 2048 位时,最多支持 245 个字节 | ||||||||||
key | string | rsa 密钥。pkcs8 格式。 加密使用公钥,解密使用私钥。 | ||||||||||
success | function | 调用成功的回调函数。 | ||||||||||
fail | function | 调用失败的回调函数。 | ||||||||||
complete | function | 调用结束的回调函数(调用成功、失败都会执行)。 |
success 回调函数
success 回调函数会携带一个 object 类型的对象, 其属性如下:
参数
object object
查看示例
属性 | 类型 | 描述 |
---|---|---|
text | string | 算法输出。加密时得到密文(base64 编码),解密时得到明文。 |
fail 回调函数
fail 回调函数会携带一个 object 类型的对象,其属性如下:
参数
object err
查看示例
属性 | 类型 | 描述 |
---|---|---|
error | number | 错误码 |
errormessage | string | 错误信息 |
fail 回调的参数为 object,error
属性为错误码,errormessage
属性为错误消息。
错误码 | 错误消息 | 凯发app官方网站的解决方案 |
---|---|---|
10 | h5rsa param(text and key) must not be empty | 传入了空 key 或空 text,请检查。 |
11 | encrypt key error | 检查传入的 key 是否有效(pkcs8 格式)。 |
encrypt error | 如果 key 为 1024 位,请检查输入的 text 是否超过长度限制(117 字节)。 | |
decrypt key error | 检查传入的 key 是否有效(pkcs8格式)。 | |
decrypt error |
|
代码示例
扫码体验
my.rsa(object object)
服务端解密-java
success参数
fail参数
my.rsa({
action: 'encrypt',
text: 'world',
// 设置公钥,需替换你自己的公钥
key:
'migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdkmi0dusvq04hl6gzgpmfk8 d6\n'
'gzulagp27qsubyxijfe04kt ohveffb6k 8nwdea5mkmzrigp022zzvdgdwpnm62\n'
'3oubwhlsfm2ekey8ppqxfxaj8lhm9t8rjlc4fec0s8qp7q5/uyrowqbt9m6t7bfk\n'
'3egoo2xokzlpysqfbqidaqab',
success: result => {
console.log('加密完成:', result.text);
},
fail(error) {
console.error('加密失败: ', json.stringify(error));
},
});
/**
* 测试用例
*/
// 密钥需要注意的是生成密钥时选择格式:pkcs8(java适用)
static string privatekey="miiccwibadanbgkqhkig9w0baqefaascal0wggjzageaaogbaj7udweirnol3oi/cu2avbvaboph7qowfoamfvtbasaw9yd3qa15wuvsazkidp/xj1clt sgcfxoramegt2fgfl4m5a9ingccqrohwljr22dgt2txjb4ne8llaop8quoftg1ij1101li7 6lfgk8shxb2tfmxs7x2h5jihuc8bnzagmbaaecf2w/toeddz6yos5nllkileorygekesw5wjtommibjugtc7du8v4wya7dze0jftr35nvvtd8o6dzi79e5chh5fuwkxqeldmqetzffplpgyaaevxdvybo3z6mckia1ptnlfj47jtdpabc2al6qfzfjforo uft/aie1pwolf/garecqqd2rlyhbirzfff9bnuawag3rne5i7ef7t64dbzo9frze660a8xk8yxzi7kmviq9aiy6lgsv1ake2w97ccbgntbrakeapnwv7ywqlrm8ybo3viflzsbtuk3rjicwjxzjzklhr91xvwqdlx50l7kt0e1sncuvjw3xr0ygfpnaw4ve9fqmswjaewyn 9tifqscaxuuodx8yyodcwu4c6nox/6fkjv6kkscvzv7t70wxvze0jh8uye2jycywg0xl4zfqgyyb2ygiqjakxltyl8l6b1pl0eqfpnkdpcw0c/nkzq0djeiznxp8eqfavbtpm5hstjikktry4whyl5knwhbahbytq8nijwzyqjaswfwm30dj5yavq3zmyky0aeyqujptdw4m3ujzwb2hynu/kfpngj oeo2a7xaferfo177ruvcqiwpal4y4pfvdw==";
// 加密算法rsa
public static final string key_algorithm = "rsa";//使用默认的算法
// rsa最大解密密文大小; 需要注意,如果用的是2048位密钥,这里需要改为256; 1024密钥是 128
private static final int max_decrypt_block = 256/2;
public static void main(string[] args) throws exception {
test();
}
// 服务端解密测试
public static void test() throws exception {
string source="zpc/dtrlduqvqgnolnunn76eb/mkyu hejmrpakrehqnekqwfzzwoxfctd0x8spqdwpsaapqrkn5smuxnc76ma6ii/2tusrrowpxyeef wwcsggbo93gublila3jvou6oiuc5arouicgma5ze612ayrmpvb235yvmxui4e7wy2z7zf1679fyew04m0hfk4eus8sat8dim606qhe/iabrreb3pq6vfi8ku53b35lxb4ipu0ijl90asj1dya6slnbbgk3ut8wbmgazbzqqneshx wivvc6fxw9ynjisdivogi0db1pphkz4cs8woet/4pjzrmb0ushfb9sggja4wo2ig==";
byte[] encrypteddata = base64.getdecoder().decode(source.getbytes());
system.out.println("—— 私钥解密 ——");
byte[] decrypteddata = decrypt_privatekey(encrypteddata, privatekey); // 调用解密方法
string str = new string(decrypteddata);
system.out.println("解密后内容: " str);
}
/**
*
* 私钥解密
* @param encrypteddata 已加密数据
* @param privatekey 私钥(base64编码)
* @return
* @throws exception
*/
public static byte[] decrypt_privatekey(byte[] encrypteddata, string privatekey) throws exception {
byte[] keybytes = base64.getdecoder().decode(privatekey.getbytes());//使用jdk的util包下的base64实现解码
system.out.println("base64解码:"keybytes);
pkcs8encodedkeyspec pkcs8keyspec = new pkcs8encodedkeyspec(keybytes);
keyfactory keyfactory = keyfactory.getinstance(key_algorithm);//使用keyfactory工厂处理私钥
key privatek = keyfactory.generateprivate(pkcs8keyspec);
cipher cipher = cipher.getinstance(keyfactory.getalgorithm());//使用cipher.getinstance解密
cipher.init(cipher.decrypt_mode, privatek);
int inputlen = encrypteddata.length;
bytearrayoutputstream out = new bytearrayoutputstream();
int offset = 0;
byte[] cache;
int i = 0; // 对数据分段解密
while (inputlen - offset > 0) {
if (inputlen - offset > max_decrypt_block) {
cache = cipher.dofinal(encrypteddata, offset, max_decrypt_block);
} else {
cache = cipher.dofinal(encrypteddata, offset, inputlen - offset);
}
out.write(cache, 0, cache.length);
i;
offset = i * max_decrypt_block;
}
byte[] decrypteddata = out.tobytearray();
out.close();
return decrypteddata;
}
{
"text": "z0uz1hvcnntfkfjcryfsvsvrseva2yj5odzmj6ml7vabngcgs4z21zbdnbub1t7vb3n4sfv9t7okargpkykvvw47oo7y2m4zsuwp1gtbnhqprxzijdnofgwxyvax5szxdupmvcz65yolhamm8brudf h9q8h9ts8upjyzyetjv4="
}
{
"error": 10,
"errormessage": "h5rsa params (text and key) must not be empty"
}
- tipide 模拟器上的 my.rsa 对输入 text 的长度限制大于真机,请以真机为准。
q:加解密的公私钥如何生成?
a:
可以使用 支付宝开放平台开发助手 生成密钥。