用 Node 实现 Java 的 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 加密
node RSA RSA ECB OAEPWithSHA-256AndMGF1Padding java
JavaScript 加密现状
目前 Java 加密的类和方法都相当成熟,但 Javascript 在加密解密方面还不是很成熟,可用的库有一些,但也不全面。
node-forge 加密库
发现一个叫 node-forge 的加密库非常全面,最重要他支持我要寻找的 RSA/ECB/OAEPWithSHA-256AndMGF1Padding
加密法,RSA/ECB/OAEPWithSHA-256AndMGF1Padding
是一种 RSA-OAEP 加密,并以 sha256
MGF1 sha1
进行填充的加密方法
RSA/ECB/OAEPWithSHA-256AndMGF1Padding
加密核心方法
const pki = forge.pki;
const publicKey = pki.publicKeyFromPem(publicKeyStr); // publicKeyStr 为 PEM pkcs8 格式的密钥
// java 用 'RSA/ECB/OAEPWithSHA-256AndMGF1Padding' 进行加密
const encrypted = publicKey.encrypt(buffer, 'RSA-OAEP', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create(),
},
});
分段加密
const MAX_ENCRYPT_BLOCK = 318; // 加密来源最大长度是 318,这取决于密钥长度的
/**
* 获取加密参数
* @param string
* @returns
*/
export function encrypt(string: string) {
const pki = forge.pki;
const publicKey = pki.publicKeyFromPem(publicKeyStr); // publicKeyStr 为 PEM pkcs8 格式的密钥
// 分段加密
const bufferList: Buffer[] = getBufferList(string, MAX_ENCRYPT_BLOCK);
const output: any[] = [];
bufferList.forEach((item) => {
// java 用 'RSA/ECB/OAEPWithSHA-256AndMGF1Padding' 进行加密
const encrypted = publicKey.encrypt(item as any, 'RSA-OAEP', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create(),
},
});
// 加密出来的密文是二进制编码,不再是 utf-8
const encryptedBuffer = Buffer.from(encrypted, 'binary');
output.push(encryptedBuffer);
});
const buffer = Buffer.concat(output);
const result = buffer.toString('base64');
return result;
}
/**
* 字符串切割
* @param str
* @param splitLength
* @returns
*/
export function getBufferList(str: string, splitLength: number) {
const buffer = Buffer.from(str, 'utf-8');
const bufferList = [];
const count = Math.ceil(buffer.length / splitLength);
for (let i = 0; i < count; i++) {
bufferList.push(buffer.slice(i * splitLength, (i + 1) * splitLength));
}
return bufferList;
}
评论
全部评论 (0)