项目链接: https://gitee.com/hyhe/httpLibraryDemo.git
一、文件介绍
Demo使用RSA加签,对请求数据进行aes加密。使用泛型进行数据处理。根据项目加解密要求不同,需要自行修改。
]
二、加解密
1、AES加解密
1.1 aes 生成IVParamsSpec
static genIvParamsSpec() { let arr = new Uint8Array(buffer.from(aesIV, 'utf-8').buffer); // 16 bytes let dataIv = new Uint8Array(arr); let ivBlob: cryptoFramework.DataBlob = { data: dataIv }; let ivParamsSpec: cryptoFramework.IvParamsSpec = { iv: ivBlob, algName: "IvParamsSpec" }; return ivParamsSpec; }
1.2 aes 生成器随机生成的密钥
static genSymKeyByData(symKeyData: Uint8Array) { let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData }; let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128'); let symKey = aesGenerator.convertKeySync(symKeyBlob); console.info('convertKey success'); return symKey; }
1.3 aes 加密
// 加密消息 static encryptMessage(message: string, aesKey: string = aesKeyStr) { let keyData = new Uint8Array(buffer.from(aesKey, 'utf-8').buffer); let symKey = AesUtil.genSymKeyByData(keyData); let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer)}; let cipher = cryptoFramework.createCipher(AesUtil.cipherName); let ivParam = AesUtil.genIvParamsSpec(); cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, ivParam); let cipherData = cipher.doFinalSync(plainText); let encryptResult = buffer.from(cipherData.data).toString('hex') return encryptResult; }
1.4 aes 解密
static decryptMessage(message: string, aesKey: string = aesKeyStr): string { let keyData = new Uint8Array(buffer.from(aesKey, 'utf-8').buffer); let symKey = AesUtil.genSymKeyByData(keyData); let cipherText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'hex').buffer)}; let decoder = cryptoFramework.createCipher(AesUtil.cipherName); let iv = AesUtil.genIvParamsSpec(); decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv); let decryptData = decoder.doFinalSync(cipherText); let decryptResult = buffer.from(decryptData.data).toString('utf-8') let base64Helper = new util.Base64Helper(); let array = new Uint8Array(decryptData.data); let decodeStr = base64Helper.decodeSync(array); return decryptResult; }
2. RSA 加解密
2.1 生成RSA秘钥对
// 生成RSA密钥对 static genKeyPairByData(pubKeyData: Uint8Array | null, priKeyData: Uint8Array | null) { let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData == null ? new Uint8Array(buffer.from("", 'utf-8').buffer) : pubKeyData }; let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData == null ? new Uint8Array(buffer.from("", 'utf-8').buffer) : priKeyData }; let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); let keyPair = rsaGenerator.convertKeySync(pubKeyData == null ? null : pubKeyBlob , priKeyData == null ? null : priKeyBlob ); console.info('convertKey success'); return keyPair; }
2.2 rsa 加密
static encryptMessage(message: string) { let pubKeyData = base.decodeSync(RSAPublicKey) let pubKeyPair = RsaUtil.genKeyPairByData(pubKeyData, null); let pubKey = pubKeyPair.pubKey; // 把字符串按utf-8解码为Uint8Array let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; let cipher = cryptoFramework.createCipher('RSA1024|PKCS1|SHA256'); cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, pubKey, null); let encryptData = cipher.doFinalSync(plainText); let encryptResult = base.encodeToStringSync(encryptData.data); return encryptResult; }
2.3 rsa 解密
// 解密消息 static decryptMessage(message: string): string { let priKeyData = base.decodeSync(RSAPrivateKey) let priKeyPair = RsaUtil.genKeyPairByData(null, priKeyData); let priKey = priKeyPair.pubKey; // 把字符串按utf-8解码为Uint8Array let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; let decoder = cryptoFramework.createCipher('RSA1024|PKCS1'); decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, priKey, null); let decryptData = decoder.doFinalSync(plainText); let decryptResult = base.encodeToStringSync(decryptData.data); return decryptResult; }
三、加密参数处理
/**
* 参数加密
* */
export function encryptRequestParam(param: Record<string, string | number | boolean>): string {
let encryptStr = AesUtil.encryptMessage(JSON.stringify(param))
return encryptStr
}
/**
* 过滤参数并排序
* */
export function filterParamKey(param: Record<string, string | number | boolean>): string[]{
let keys: Array<string> = []
recordKeys(param).forEach(element => {
let key: string = element
let value: string = param[key].toString()
keys.push(key)
});
return keys.sort()
}
/**
* 签名 根据项目要求添加到相应的地方
* */
export function signParam(filterKeys: Array<string>, param: Record<string, string | number | boolean>) {
let contents: Array<string> = []
filterKeys.forEach(element => {
contents.push(element + "=" + param[element])
});
return contents.join("&")
}
// Record转为Map
export function recordKeys(myRecord: Record<string, string | boolean | number>): string[] {
let keys: string[] = [];
Object.keys(myRecord).forEach(element => {
keys.push(element)
});
return keys;
}
四、加密参数配置
static encryptionParam(extraParam: Record<string, string | number | boolean>): Record<string, string> {
// 对参数进行加密处理
let encryptParam: Record<string, string> = {"key": encryptRequestParam(extraParam)}
return isEncrypt ? encryptParam : {}
}
五、解密后台返回数据
static responseHandler<T>(url: String, response: http.HttpResponse, reBackResponseModel: (responseModel: ResponseModel<T>) => void ): void {
let responseModel: ResponseModel<T> = new ResponseModel("", 10000, false, "", null) as ResponseModel<T>;
// 需要处理Url
if (url == "") {
return
}
if (http.ResponseCode.OK == response.responseCode) {
if (isEncrypt) {
responseModel.data = AesUtil.decryptMessage(JSON.stringify(response.result))
} else {
responseModel.data = JSON.stringify(response.result)
}
console.log(`typeof=====${typeof response.result}`)
let tModel: T = JSON.parse(JSON.stringify(response.result));
if (tModel && response.result["success"] == true) {
responseModel.msgCode = 200
responseModel.isSuccess = true
responseModel.resultModel = tModel
} else {
responseModel.msgCode = response.result["code"]
responseModel.msg = response.result["message"]
}
reBackResponseModel(responseModel)
} else {
// 请求失败
responseModel.msg = 'request fail'
reBackResponseModel(responseModel)
}
}