短信所發送的字節有限,一般為140字節左右,若對短信進行簽名,會導致短信利用率降低,故短信簽名的過程中,簽名的長度很關鍵,ECDSA 簽名方式的在長度適中(根據加密算法位數不同而不同)的情況下,提供了很好的安全保障。另外手機短信一般不需要進行加密,因為手機一般處于移動狀態,其網絡變化,比較大,攻擊者要截取并分析比較困難。
手機短信安全防護重點放在:防止被人修改
ECDSA常用簽名算法
- ECDsaP256, 其公鑰長度 72 Bytes,
- ECDsaP384,其公鑰長度 104 Bytes,
- ECDsaP521 ,其公鑰長度 140 Bytes,
其中公鑰最前面的8個字節是 附加字節。附加加字節的前4字節表示 “ECS1”、“ECS3”、“ECS5” 三種類型,后4字節表示公鑰長度。例如256位的 ECDsaP256 算法,前面8個字節是 0x45, 0x43, 0x53, 0x31, 0x20, 0x00, 0x00, 0x00 ,前面4個字節 0x45,0x43,0x53,0x31 表示 “ECS1” ,后面4個字節 0x20,0x00,0x00,0x00 表示公鑰是256位。
ECDsaP256簽名
簽名組成
對于ECDsaP256算法,其簽名結果其實就是兩個很大的整數r(random)和簽名s(signature),由于普通的數據類型不夠,所以就用數組來表示,r和s都是32個字節的長度,總共是64個字節。
簽名方法
一般ECDsaP256簽名算法庫都會提供兩種簽名方法:
- 普通格式:就是兩個32位整數組成的64字節串
- ASN1格式:由ASN1編碼而成的包含兩個32位整數的70/71/72字節串
ASN1編碼格式說明
ASN1將簽名產生的 r 和 s 看作兩個整數,若其第一個字節最高位為 1,則在整數前插入0x00。
以下是一個ECDsaP256算法簽名結果:
byte[] signForIos = new byte[]{0x30,0x45,0x02,0x20,0x6C,0x80,0x22,0xE4,0xA5,0x89,0x8A,0x81,0xE9,0x82,0x0C,0x13,
0xC6,0xE7,0x09,0x95,0xC9,0x1C,0x4F,0x00,0x32,0x13,0x59,0xB2,0x2D,0xD3,0xEF,0xE4,
0x9D,0xDD,0x3B,0xAD,0x02,0x21,0x00,0xF0,0x84,0x9E,0x2E,0xB6,0x01,0x3B,0x2A,0x81,
0xB0,0x36,0x83,0x51,0x7F,0x20,0x56,0xD7,0xFB,0xD6,0x9B,0x76,0x38,0x39,0xF8,0xD2,
0x89,0xED,0x32,0x24,0x0D,0xA1,0x25};
其中:
第1字節:0x30表示一種通用的格式
第2字節:0x45表示后面跟了69個字節的數據
第3字節:0x02表示后面是一個整數
第4字節:0x20表示整數長度是32個字節
第35字節:0x02表示后面是個整數
第36字節:0x21表示整數長度是33個字節
第37字節:0x00需要忽略掉,這個是由于ASN1編碼產生的,
參考文檔:使用C#驗證IOS9產生的ECDSA簽名
版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證)