Jar аварийно завершает работу при расшифровке метода токена авторизации с шифрованием AES в коде. hs_err _pid файл упоминает arrayof_jbyte_fill - PullRequest
3 голосов
/ 03 августа 2020

Эта проблема возникает примерно раз в день в производственной среде. Нагрузка составляет около 20TPS, и дешифрование AES вызывается дважды для каждого запроса на сервере. Ошибка генерируется не для всех запросов, но вылетает один раз в день. Ниже приведен фрагмент файла hs_err_pid.

Среда выполнения Java обнаружила фатальную ошибку:

SIGSEGV (0xb) at pc = 0x00007f26cc5de47e, pid = 53978, tid = 0x00007f26837f7700 Версия JRE: Java (TM) Среда выполнения SE (8.0_241-b31) (сборка 1.8.0_241-b31) Java ВМ: Java HotSpot (TM) 64-разрядная серверная виртуальная машина ( 25.241-b31 смешанный режим linux -amd64 сжатый ой) Problemati c frame: v ~ StubRoutines :: arrayof_jbyte_fill

Current thread (0x00007f26d0a03800):  JavaThread "http-nio-9094-exec-10" daemon 
[_thread_in_Java, id=54617, stack(0x00007f26836f7000,0x00007f26837f8000)]


Stack: [0x00007f26836f7000,0x00007f26837f8000],  sp=0x00007f26837f44f0,  free space=1013k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
v  ~StubRoutines::arrayof_jbyte_fill
J 26458 C2 java.util.Arrays.fill([BB)V (21 bytes) @ 0x00007f26cc737ca2 
[0x00007f26cc737c60+0x42]
j  com.sun.crypto.provider.CipherCore.fillOutputBuffer([BI[BII[B)I+73
j  com.sun.crypto.provider.CipherCore.doFinal([BII)[B+65
j  com.sun.crypto.provider.AESCipher.engineDoFinal([BII)[B+7
j  javax.crypto.Cipher.doFinal([B)[B+30
j  com.hello.genesys.common.AES.decrypt([BLjava/lang/String;)[B+92

Ниже приводится расшифровка метод:

public static byte[] decrypt(byte[] data, String password) throws Exception {
    try {
        log.info("/// Inside the decrypter method of AES class ////");
        if (null == cipher) {
            log.info("The Cipher is null and hence forming new object of cipher");
            cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
        }

        log.info("Key generation method to be called");
        Key k = new SecretKeySpec(password.getBytes(), AES_ENCRYPTION_TYPE);
        
        log.info("Cipher initialization to be done");
        cipher.init(Cipher.DECRYPT_MODE, k);

        log.info("The byte array value to be returned");
        
        return cipher.doFinal(data);
    } catch (Throwable e) {
        log.info("Inside Exception of AES decryption method");
        e.printStackTrace();
    }
    return null;
}

Этот метод вызывается в другом классе:

byte[] decrypter = AES.decrypt(decodeToken, _env("tokenSalt"));

Он не генерирует исключение, а вылетает с ошибкой, связанной с arrayof_jbyte_fill . Пожалуйста, помогите мне решить эту проблему, поскольку она возникает только в производственной среде, но не в более низкой среде. Ссылка на файл hs_err_pid для более подробной информации: https://drive.google.com/file/d/1WDG4rm7vIw6HDbhZPtXjud7r8TEh4d74/view?usp=sharing

1 Ответ

0 голосов
/ 22 августа 2020

Ошибка была связана с самим зашифрованным объектом. Теперь я создал и инициализировал локальный объект шифра вместо глобального, и, похоже, в течение 2 недель после развертывания не было cra sh. Так как 2 процесса дешифрования происходили одновременно, один за другим, во время второго запроса дешифрования происходил сбой, поскольку объект все еще использовался первым. Итак, это мой анализ этого вопроса

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