第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

字節(jié)數(shù)組在替換字符串變量時給出不同的輸出

字節(jié)數(shù)組在替換字符串變量時給出不同的輸出

繁星淼淼 2023-03-17 14:02:09
我正在嘗試替換一些現(xiàn)有的涉及字符串變量存儲的邏輯,以使用字節(jié)數(shù)組(出于安全原因)。下面有兩個塊方法 A() 與舊邏輯和方法 B() 與替換。但是,在相似點打印輸出時,我看到字節(jié)數(shù)組的輸出不同。我錯過了什么嗎?public class HelloWorld{     public static void main(String []args){        System.out.println("Hello World ");        A();        B();     }     public static void A()     {         String expDetails = "";         if (true) {            String expYear = "1986";            expDetails = expYear;        }        System.out.println("Output in between "+expDetails);        // expiry month in MM        String monthStr = "";        if (true) {            String expiryMonth = "12";            int month = Integer.parseInt(expiryMonth) + 1;            expDetails += month > 9 ? String.valueOf(month) : "0" + month;        }        System.out.println("Output "+expDetails);     }     public static void B()     {         byte[] expDetailsNew = null;         if (true) {            String expYear = "1986";            expDetailsNew = expYear.getBytes();            System.out.println("Inside");        }        System.out.println("Output in between "+expDetailsNew.toString());        String monthStr = "";        if (true) {            String expiryMonth = "12";            int month = Integer.parseInt(expiryMonth) + 1;            if(month>9)            {                byte[] c = new byte[expDetailsNew.length + Integer.toString(month).length()];                System.arraycopy(expDetailsNew, 0, c, 0, expDetailsNew.length);                System.arraycopy(expDetailsNew, 0, c, expDetailsNew.length, Integer.toString(month).length());                String finalVal = new String(c);            System.out.println("Output "+finalVal);            }        }     }}以下是輸出 -Hello World Output in between 1986Output 198613InsideOutput in between [B@6d06d69cOutput 198619更新根據(jù)@VGR 的回答,嘗試像這樣附加月份值 -CharBuffer another = CharBuffer.allocate(2); new Formatter(another).format("%02d", month); expDetailsNew.append(another);expDetailsNew.flip();System.out.println("Output "+expDetailsNew.toString());但是輸出是空的。
查看完整描述

2 回答

?
慕哥9229398

TA貢獻1877條經(jīng)驗 獲得超6個贊

為避免在字符串中存儲敏感信息,請使用char數(shù)組。不要使用平臺的默認字符集轉換為字節(jié);您冒著破壞信息的風險。事實上,Java SE 中許多與安全相關的方法已經(jīng)使用了char數(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子句中。你真的不希望用戶認為應用程序在實際工作時沒有工作,對吧?


查看完整回答
反對 回復 2023-03-17
?
Smart貓小萌

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,


查看完整回答
反對 回復 2023-03-17
  • 2 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號