Чтобы избежать хранения конфиденциальной информации в строках, используйте char
массивы.Не конвертируйте в байты, используя кодировку платформы по умолчанию;вы рискуете испортить информацию.Фактически, ряд связанных с безопасностью методов в Java SE уже используют char
массивы:
Хотя вы можете использовать System.arraycopy
, с CharBuffer работать намного проще, и даже есть полезный метод toString .
Ваш оригиналВопрос показывает код, который намного яснее, чем код в этом вопросе, поэтому я буду использовать код из этого:
CharBuffer expDetails = CharBuffer.allocate(6);
// extract expiry year in YYYY
if (!CommonUtil.isEmpty(paymentDetails.getExpiryYear())) {
expDetails.append(paymentDetails.getExpiryYear());
}
// expiry month in MM
if (!CommonUtil.isEmpty(paymentDetails.getExpiryMonth())) {
int month = Integer.parseInt(paymentDetails.getExpiryMonth()) + 1;
new Formatter(expDetails).format("%02d", month);
}
expDetails.flip();
reqParams.put("CardNum",
encrypt(params[4], paymentDetails.getCardNumber()));
reqParams.put("expiryDate", encrypt(params[4], expDetails.toString()));
reqParams.put("CVVNum",
encrypt(params[4], paymentDetails.getCvvNumber()));
Как указывалось в отчете об уязвимости, объекты String являются неизменяемыми и могут быть интернированы, чтобыуменьшить избыточное распределение.Это означает, что теоретически вредоносный код может получить доступ к объектам String, используемым другими объектами.Чтобы избежать этой возможности и обеспечить безопасность для строковых значений, вы можете изменить свой метод encrypt
так, чтобы он принимал char[]
аргументы вместо строк.Например:
public byte[] encrypt(String key, char[] sourceValue) {
Formatter hex = new Formatter(Locale.US);
for (char c : sourceValue) {
hex.format("%04x", (int) c);
}
return hex.getBytes(StandardCharsets.UTF_8);
}
(Это всего лишь пример, основанный на ваших комментариях; я не знаю, что на самом деле делает ваш метод encrypt
.)
Кроме того, никогда не пишитепустой catch
блок.Поскольку это, по-видимому, метод веб-службы, вы можете просто удалить try / catch и просто добавить необходимые исключения в предложение throws
вашего метода.Вы действительно не хотите, чтобы пользователи думали, что приложение работает, когда оно на самом деле не работает, верно?