Java實現SHA-256簽名加密
阿新 • • 發佈:2019-02-10
先將程式碼貼出來:
解析如下: 因為byte是一個位元組表示8位,第一步 char ch = Character.forDigit(((byte) i >> 4) & 0x0F, 16); ch = Character.forDigit((byte) i & 0x0F, 16); 將0-255全部用16進製表示, 0-255如果先向右位移4位,那麼接下來表示的 將是前面的4位轉換成16進位制,再不位移的情況下與0X0F與運算,那麼就是 表示的後面4位用16進製表示. 如: 255 : 1111 1111 右移4位 ---> 0000 1111這時候表示16進位制就是F 不位移但是與0x0F與運算 ---> 0000 1111 這時候表示的也是Fprivate static final String[] hexStrings = new String[256]; static{ //將0-255全部分別表示成16進位制的字元 for(int i=0;i<256;i++){ StringBuilder sb = new StringBuilder(2); char ch = Character.forDigit(((byte)i>>4)&0x0F, 16);//取到byte左4位用16進製表示的字元 sb.append(Character.toUpperCase(ch)); ch = Character.forDigit(((byte)i>>4)&0x0F, 16);//取到byte右4位用16進製表示的字元 sb.append(Character.toUpperCase(ch)); hexStrings[i] = sb.toString(); } } /** * 資料簽名 * @param signData 要簽名的資料 * @param charset 字元編碼 * @param signType 簽名型別 * @return * @throws UnsupportedEncodingException */ public static String sign(String signData,String charset,String signType) throws UnsupportedEncodingException{ //資料第一步按簽名方式加密成位元組陣列 byte[] digest = DigestUtils.getDigest(signType).digest(signData.getBytes(charset)); StringBuilder sb = new StringBuilder(digest.length*2); for(byte b:digest){ sb.append(hexStrings[(int)b & 0xFF]); } return sb.toString(); }