MAC密鑰的支算法結合了MD5和SHA算法的優勢,並加入持,是一種更爲安全的消息摘要算法。
MAC(Message Authentication Code,消息認證碼算法)是含有密鑰的散列函數算法,兼容了MD和SHA算法的特性,並在此基礎上加入了密鑰。消息的散列值由只有通信雙方知道的祕密密鑰K來控制,因次,我們也常把MAC稱爲HMAC(keyed-Hash Message Authentication Code)。
MAC算法主要集合了MD和SHA兩大系列消息摘要算法。MD系列的算法有HmacMD2、HmacMD4、HmacMD5三種算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384.HmacSHA512五種算法。
經過MAC算法得到的摘要值也可以使用十六進制編碼表示,其摘要值長度與參與實現的摘要值長度相同。例如,HmacSHA1算法得到的摘要長度就是SHA1算法得到的摘要長度,都是160位二進制碼,換算成十六進制編碼爲40位。
但是這個加密算法在多線程是不安全的 如果使用全局的Mac 就會出現crash,而且這個Crash還是C層報的錯誤,找了一天,終於找到是線程安全的問題了 所以在多線程同時使用的時候 一定不要使用全局的Mac 解決辦法:在使用的每個線程 New一個Mac的實例。也可以在每個線程中結合 ThreadLocal 這樣可以保證每個線程有一個Mac的實例 當從ThreadLocal中可以獲取到實例的時候就用該實例 如果獲取不到 那就去new 一個Mac實例 然後Set到ThreadLocal中 這樣就解決了因爲多線程造成的Java MAC加密的Crash
2019-12-30 11:14:51.483 19250-19250/? E/DEBUG: failed to readlink /proc/19245/fd/125: No such file or directory
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: Build fingerprint: 'samsung/dreamqltesq/dreamqltesq:9/PPR1.180610.011/G950USQS6DSJ1:user/release-keys'
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: Revision: '12'
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: ABI: 'arm64'
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: pid: 19132, tid: 19245, name: monkey.cool/... >>> cool.monkey.android <<<
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x20
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: Cause: null pointer dereference
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: x0 0000000000000000 x1 0000006f381ceea8 x2 0000000000000020 x3 0000006f80ed7b00
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: x4 0000006f80ed7978 x5 0000006f80ed7b78 x6 0000000000000000 x7 0000000000000000
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: x8 000000701e21f1c0 x9 0000000000000000 x10 0000000000000000 x11 0000002000000000
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: x12 0000000000000000 x13 0000000000000000 x14 0000006f97f133e4 x15 0000000000000000
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: x16 000000701e2f4d70 x17 000000701cceaff0 x18 0000000000000008 x19 0000000000000020
2019-12-30 11:14:51.526 19250-19250/? A/DEBUG: x20 0000000000000000 x21 0000006f381ceea8 x22 0000006f381cef38 x23 0000000000000020
2019-12-30 11:14:51.527 19250-19250/? A/DEBUG: x24 0000006f381d3588 x25 0000006f381d3588 x26 0000006f9161fca0 x27 0000000000000001
2019-12-30 11:14:51.527 19250-19250/? A/DEBUG: x28 0000000000000000 x29 0000006f381cee90
2019-12-30 11:14:51.527 19250-19250/? A/DEBUG: sp 0000006f381cee60 lr 000000701e20b594 pc 000000701e21a6f8
2019-12-30 11:14:51.585 19250-19250/? A/DEBUG: backtrace:
2019-12-30 11:14:51.585 19250-19250/? A/DEBUG: #00 pc 00000000000956f8 /system/lib64/libcrypto.so (SHA256_Update+36)
2019-12-30 11:14:51.585 19250-19250/? A/DEBUG: #01 pc 0000000000086590 /system/lib64/libcrypto.so (HMAC_Final+124)
2019-12-30 11:14:51.585 19250-19250/? A/DEBUG: #02 pc 000000000001a208 /system/lib64/libjavacrypto.so (NativeCrypto_HMAC_Final(_JNIEnv*, _jclass*, _jobject*)+256)
2019-12-30 11:14:51.585 19250-19250/? A/DEBUG: #03 pc 000000000001623c /system/framework/arm64/boot-conscrypt.oat (offset 0x16000)