2 回答

TA貢獻1877條經(jīng)驗 獲得超6個贊
為避免在字符串中存儲敏感信息,請使用char
數(shù)組。不要使用平臺的默認字符集轉換為字節(jié);您冒著破壞信息的風險。事實上,Java SE 中許多與安全相關的方法已經(jīng)使用了char
數(shù)組:
PBEKeySpec構造函數(shù)
雖然您可以使用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[]參數(shù)而不是字符串。例如:
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塊。由于這似乎是一種 Web 服務方法,您應該能夠刪除 try/catch 并簡單地將必要的異常添加到您的方法的throws子句中。你真的不希望用戶認為應用程序在實際工作時沒有工作,對吧?

TA貢獻1911條經(jīng)驗 獲得超7個贊
System.out.println("Output in between "+new String(expDetailsNew));
上面解析了對象引用。
嘗試改變
System.arraycopy(expDetailsNew, 0, c, expDetailsNew.length,
到
System.arraycopy(Integer.toString(month).getBytes(), 0, c, expDetailsNew.length,
添加回答
舉報