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)