Node.js расшифровка зашифрованной строки из MySQL вызывает EVP_DecryptFinal_ex: неверная конечная длина блока - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть 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();

Что я делаю неправильно?

1 Ответ

0 голосов
/ 19 февраля 2020

Проблема была в длине и типе моего столбца. Код шифрования и дешифрования работает нормально. Данные, возвращаемые с mysql, обрезались, поэтому они не могли правильно расшифровываться. Глупая ошибка. Спасибо за понимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...