1. 程式人生 > >Java實現SHA-256簽名加密

Java實現SHA-256簽名加密

先將程式碼貼出來:

private 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();
	}
解析如下: 因為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 這時候表示的也是F
所以最後255實現SHA256加密之後就是FF 在方法初始話的時候,先講0-255全部轉化成以16進製表示.注意,不管結果是什麼都會佔用兩個位元組 0 ---> 00 思想解析: 1.將0-255全部轉化成16進位制的形式的字串陣列(兩個為一組) 2.將要簽名的資料轉化成byte陣列(byte陣列為整形範圍是(-128~127))但是將資料與0XFF與運算之後範圍變成0~255 ((int) b & 0xFF) 注意,byte轉int時需要跟0xFF進行與運算,是防止int(32bit)前 24位補1 ,造成錯誤運算. 3.d.append(hexStrings[(int) b & 0xFF]);轉換成byte之後的資料都對應0-255轉化成字串陣列的一個數.
4.將所有的結果結合在一起就是簽名資料.