У меня есть 2 функции в классе обслуживания шифрования. 1 для шифрования данных и 1 для расшифровки данных.
export default class EncryptionService {
private static algorithm = 'aes-256-cbc';
private static key = createHash('sha256').update(String('keyString')).digest('base64').substr(0, 32);
private static iv = Buffer.from('ivString');
public static encryptData(data: string): string {
const cipher = createCipheriv(this.algorithm, this.key, this.iv);
let encrypted = cipher.update(data);
encrypted = Buffer.concat([encrypted, cipher.final()]);
const encryptedStr = encrypted.toString('base64');
console.log('encryptedStr: ' + encryptedStr);
return encryptedStr;
}
public static decryptData(data: string): string {
const decipher = createDecipheriv(this.algorithm, this.key, this.iv);
const decrypted = decipher.update(data, 'base64');
const decryptedData = Buffer.concat([decrypted, decipher.final()]).toString();
console.log('decryptedData: ' + decryptedData);
return decryptedData;
}
}
В моем контроллере, когда я вызываю функцию encryptData, а затем немедленно вызываю функцию decryptData, передавая зашифрованные данные, возвращенные функцией encryptData, я получаю правильную незашифрованную строку обратно.
import EncryptionService from '../services/encryption-service';
export default class MyController {
public async postData(request: Request, response: Response) {
const encryptedAudioFileName = EncryptionService.encryptData(request.body.audio_file_name);
EncryptionService.decryptData(encryptedAudioFileName);
}
}
Однако - когда я сохраняю зашифрованные данные, возвращенные из encryptData, в mySQL через функцию post в контроллере, а затем пытаюсь расшифровать данные, полученные из mySQL через функцию get в контроллере, возникает ошибка в функция decryptData с указанием «EVP_DecryptFinal_ex: неверная длина конечного блока».
public async postData(request: Request, response: Response) {
Logger.info(request, response, 'Request Received');
try {
if (request.body) {
const dataEntity = new dataEntity();
dataEntity.audio_file_name = EncryptionService.encryptData(request.body.audio_file_name);
const result = await getManager().save<dataEntity>(dataEntity);
if (result) {
const responseObject = {
timestamp: new Date().toUTCString(),
method: request.method,
status: 'Success',
statusCode: 201,
message: 'successfully created.',
path: request.originalUrl,
reference: result.id,
};
Logger.success(request, response, responseObject);
response.status(201).json(responseObject);
} else {
response.status(400).json(
ResponseService.badRequestErrorResponseObject(request, response));
}
} else {
response.status(400).json(
ResponseService.badRequestErrorResponseObject(request, response, 'Body is invalid'));
}
} catch (error) {
response.status(500).json(
ResponseService.internalErrorResponseObject(request, response, error));
}
}
public async getData(request: Request, response: Response) {
Logger.info(request, response, 'Request Received');
try {
const allData: dataEntity[] =
await getConnectionManager().get().getRepository(dataEntity).find();
if (allData) {
const entityResponseArray = [] as object[];
allData.forEach( (entity) => {
const dataResponse = {} as {id: number, audioFileName: string};
dataResponse.id = entity.id!;
dataResponse.audioFileName = EncryptionService.decryptData(entity.audio_file_name!);
entityResponseArray.push(dataResponse);
});
Logger.success(request, response, 'Get list of data');
response.json(entityResponseArray);
} else {
response.status(404).json(
ResponseService.notFoundErrorResponseObject(request, response));
return;
}
} catch (error) {
response.status(500).json(
ResponseService.internalErrorResponseObject(request, response, error));
}
}
Это происходит в этой строке в decryptData:
const decryptedData = Buffer.concat([decrypted, decipher.final()]).toString();
Что я делаю неправильно?