2 回答
TA贡献1877条经验 获得超6个赞
为避免在字符串中存储敏感信息,请使用char
数组。不要使用平台的默认字符集转换为字节;您冒着破坏信息的风险。事实上,Java SE 中许多与安全相关的方法已经使用了char
数组:
PBEKeySpec构造函数
虽然您可以使用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块。由于这似乎是一种 Web 服务方法,您应该能够删除 try/catch 并简单地将必要的异常添加到您的方法的throws子句中。你真的不希望用户认为应用程序在实际工作时没有工作,对吧?
TA贡献1911条经验 获得超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,
添加回答
举报