QR-сканер возвращает значение, отличное от того, которое я передаю ему - PullRequest
0 голосов
/ 06 января 2020

Пожалуйста, не обращайте внимания на алгоритм кодирования / размер изображения / пароль и т. Д. c. Это демо. Я генерирую qr-код следующим образом:

private final byte[] keyValue =
        new byte[]{'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T'};


public String generateQR(ConsumerDto consumerDto) {
    CryptoUtil cryptoUtil = new CryptoUtil(keyValue);
    String encryptedConsumerDto = cryptoUtil.encrypt(String.valueOf(consumerDto));

    String resultImage = "";
    if (!StringUtils.isEmpty(consumerDto)) {
        QRCodeWriter writer = new QRCodeWriter();
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            BitMatrix bitMatrix = writer.encode(encryptedConsumerDto,
                    BarcodeFormat.QR_CODE, 500, 500, getHintsForEncoding());
            BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
            ImageIO.write(bufferedImage, "png", outputStream);
            resultImage = "data:image/png;base64," + Base64.getEncoder().encodeToString(outputStream.toByteArray());
            return resultImage;
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return resultImage;
}

После генерации, когда я возвращаю значение в интерфейс, он находится в base64:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AQAAAADjreInAAAFjElEQVR42u2dO47jTAyEW3Dg0EfwUXw0+Wg+yhxBoQND3Car2NLaXuwP/IG4QDmYh6RPE/SDr2pOs//1WZp48eLFixcvXvy/yC/NP+fl+mjTq136lfXUvzzm1a/f7v2e/bS5nZ6Xn9u9P+KfSXwZ/tq/vPoz/VGA/Td/qV80u08YbP8TzXm/aOIL8T7wwa+nZ+fmDeyvmSd7Yhq0hidxUXwtvg+urbFU+TYDMffVPKZIB8UX5fszvsdy4K+GEY9vl76og3g0E1+Oj8Htr5njWlhMvxjr99bvte3DtW3i6/DD/4nF+ddvf/afxB/BZzDh4//yFdv91+6qxjN0av0iJsX9j/GL+IP4WKovmkq4Oqd4G5fsRMMJbwhByfv6F38gH8SzxTbsprIx4uiOq1tTvxjxY8yGfVAivgSPxUmP1Yl0fOAN+TN+L2OTmCkmvgpvw2P1xI3PBl/GbiotCCR17ghRIpvjbqz4KvzCZzy55iuWFvPR8LYIShBU+vpdG3I74qvwFmvUwRnLOF7TiXj0ZvBY59iinY8tWnwZHlax0VTG55TxvxvO/u4W3lAElc733Vh8JZ7Ozcz8WxhOZGx8GtA3SjMaT07iq/BuDlfWmBAjTvlS+j8elBiN6oppYOKr8EtsrjHUuRuHNbW4eDNWo9aYFL7/+jYsvgyPwCPGH/svYvz4LYxqvObOEGXFN/GleKxRd3zatn7hzTJxg4HPe018IT42Xv9pbMPtsqv/chpkNeoj/hB/MH9DxvvGVFvj+o3AIxQzl3CKaGlDYjOJr8JzjBvqF/4a2siRDThz/WZRw/dm8aV4i/EfGhnK2MJ/xdtYvx9/SXwV3nfclTturtjzkhH/A9GkIf/t2ZyP+EX8ofzCUgXEoYwYMRvOuVR/6Bsh0swSlfgKvNFwYsUOqaGNoISPGIsa7/uv+IP53GpRnLj6jkv9E+KPF62pQWK6ZQrEl+BpOKmqGGY0Iw4aTtZ/eU98GZ7pbOifzkMjQ1d1bMM8VMFKsfgyfBhHgNBoN3izxsCDc2OlDPiL/yT+SH7Bwl3GijVWE5lq446LolTLmSK+Ch83edQMj05Zzef5M+Zvtv33N/2a+ON5lhHbTj8a/k8L/X24sawfbkp98UV4Kp62wYWapg2LiTTOKZU2TXwlfklxk2X+jYcqkPjGiAcPpfc3/aH4g3mm2uDjcIwpteemzCMynBuT+EJ8o+IwhYdhKluKSn/X3yNhJ74Sz6MuM8SF2H99xT63ahS0bX4vHV7xNXhYxRTeX36GmnvNpDjTqPSGvuuHxR/FB4iqRJYKIQNes/7E/hUo6mfBUXwVnj0OMn9z42lsCn8z/8b433AMRnwZnuJCOqe7jA15Ku6p5v5evxJ/IG+PnbiJx3jHaRjPDWAb3o6ofervxR/IQ9WLiDFPLDH/tvmvPBRjPGIvvgyfPZo2cYWxGxCOMdGMIqhkGrWZ+EJ8irN3qdLon9aSwGtGbpxtLMSX4EfjJmPjra1/Ez0eY+GwjTT4JL4KT8V9wzHCjCavVFyg/oRuFo3nP9/1a+KP5fOM/C6NOsJIdpx8pP7iW/1K/KG8DWJNjS/zN6mYQTdYCi+QxhFfhU/9fV7byoiv7ain3XfVqI/+a+KP5Rt7NLFV2tuJsxTOxMCnxEZ8FX70v7P3MBK5Vcv+I0Op+NE/RvyBfPafHOd3LWWIr5GUazw/mG2cTHwdfvQ/j+YiKPwyR4OOk9l/JJvCfvZfE38kP7qac3PdqUljqabHs4w26OLL8XBjz1iZz1Rs7/uPpFLjI38gvgY/WtXvkgI2DsVA/8uTvia+Dj/+ucDYhp88hp2pbh6xQPz40f9O/KH89v93GntssXCBbqIc8Wkr6r/V/8Ufyuv/f4kXL168ePHixf9n/hee2Rc2UbypBwAAAABJRU5ErkJggg==

Но когда интерфейс пытается сканировать код (любой qr-сканер), он получает это значение:

zrzVfLTvdptoDEM0mDM795LN7xsiK8OND74EPuDfcc+pxniItkpDACO0yssEHNNrX6IdccyeyTlrDBmIsaETv5xsOMjOpLY0ZelX/kkyjwr7UQR59VmKLf4a7EwBlMGZsKFIpQoqXVptAEBDthL78QsJahLpCCtq7bcsOv9DUhjCz5P1j3Ai5GZ1xGobuVXRkLn0SYJInjPeSHihjcx47Q== 

Мне нужно получить из внешнего интерфейса ту же строку base64, которую я дал ему в кодировке, чтобы потом можно было ее декодировать. Вот криптуал, который я использую для кодирования / декодирования объектов:

public class CryptoUtil {

private static final String CRYPTO_ALGORITHM = "AES";
private static final Logger LOGGER = LoggerFactory.getLogger(CryptoUtil.class);
private static final byte[] keyValue =
        new byte[]{'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'};


private final Key key;
private final Cipher cipher = getCipherInstance();

public CryptoUtil(byte[] key) {
    this.key = new SecretKeySpec(key, CRYPTO_ALGORITHM);
}

private Cipher getCipherInstance() {
    try {
        return Cipher.getInstance(CRYPTO_ALGORITHM);
    } catch (GeneralSecurityException e) {
        LOGGER.error("Crypto error: Unable to get cipher instance");
        throw new RuntimeException(e);
    }
}

public String encrypt(String password) {
    try {
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = cipher.doFinal(password.getBytes());
        return new BASE64Encoder().encode(encVal);
    } catch (GeneralSecurityException e) {
        LOGGER.error("Crypto error: Unable to encrypt password");
        throw new RuntimeException(e);
    }
}

public String decrypt(String encryptedPassword) {
    try {
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decodedValue = new BASE64Decoder().decodeBuffer(encryptedPassword);
        return new String(cipher.doFinal(decodedValue), StandardCharsets.UTF_8);
    } catch (GeneralSecurityException | IOException e) {
        LOGGER.error("Crypto error: Unable to encrypt password");
        throw new RuntimeException(e);
    }
}

}

...