From 21e0ea417012e401fb763cf89e6d4425d82bcb55 Mon Sep 17 00:00:00 2001 From: zxl01071856 Date: Fri, 19 Aug 2022 14:53:20 +0800 Subject: [PATCH] Modification of the sign method of the servicesignature interface --- .../oss/common/auth/HmacSHA1Signature.java | 30 +++++++++++++++---- .../oss/common/auth/HmacSHA256Signature.java | 30 +++++++++++++++---- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/aliyun/oss/common/auth/HmacSHA1Signature.java b/src/main/java/com/aliyun/oss/common/auth/HmacSHA1Signature.java index da3e3e5b..0427dfe2 100644 --- a/src/main/java/com/aliyun/oss/common/auth/HmacSHA1Signature.java +++ b/src/main/java/com/aliyun/oss/common/auth/HmacSHA1Signature.java @@ -20,6 +20,7 @@ package com.aliyun.oss.common.auth; import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import com.aliyun.oss.common.utils.BinaryUtil; @@ -40,8 +41,11 @@ public class HmacSHA1Signature extends ServiceSignature { private static final Object LOCK = new Object(); - /* Prototype of the Mac instance. */ - private static Mac macInstance; + private final ThreadLocal reference; + + public HmacSHA1Signature() { + this.reference = new MacThreadLocal(); + } public String getAlgorithm() { return ALGORITHM; @@ -53,8 +57,8 @@ public String getVersion() { public String computeSignature(String key, String data) { try { - byte[] signData = sign(key.getBytes(DEFAULT_ENCODING), data.getBytes(DEFAULT_ENCODING), macInstance, - LOCK, ALGORITHM); + byte[] signData = sign(key.getBytes(DEFAULT_ENCODING), data.getBytes(DEFAULT_ENCODING), getMac(), + LOCK, ALGORITHM); return BinaryUtil.toBase64String(signData); } catch (UnsupportedEncodingException ex) { throw new RuntimeException("Unsupported algorithm: " + DEFAULT_ENCODING, ex); @@ -62,6 +66,22 @@ public String computeSignature(String key, String data) { } public byte[] computeHash(byte[] key, byte[] data) { - return sign(key, data, macInstance, LOCK, ALGORITHM); + return sign(key, data, getMac(), LOCK, ALGORITHM); + } + + public Mac getMac() { + return reference.get(); + } + + private static class MacThreadLocal extends ThreadLocal { + + @Override + protected Mac initialValue() { + try { + return Mac.getInstance(HmacSHA1Signature.ALGORITHM); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Unsupported algorithm: " + HmacSHA1Signature.ALGORITHM, e); + } + } } } \ No newline at end of file diff --git a/src/main/java/com/aliyun/oss/common/auth/HmacSHA256Signature.java b/src/main/java/com/aliyun/oss/common/auth/HmacSHA256Signature.java index 2b5c83f9..b4e9131c 100644 --- a/src/main/java/com/aliyun/oss/common/auth/HmacSHA256Signature.java +++ b/src/main/java/com/aliyun/oss/common/auth/HmacSHA256Signature.java @@ -20,6 +20,7 @@ package com.aliyun.oss.common.auth; import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import com.aliyun.oss.common.utils.BinaryUtil; @@ -40,8 +41,11 @@ public class HmacSHA256Signature extends ServiceSignature { private static final Object LOCK = new Object(); - /* Prototype of the Mac instance. */ - private static Mac macInstance; + private final ThreadLocal reference; + + public HmacSHA256Signature() { + this.reference = new HmacSHA256Signature.MacThreadLocal(); + } public String getAlgorithm() { return ALGORITHM; @@ -53,8 +57,8 @@ public String getVersion() { public String computeSignature(String key, String data) { try { - byte[] signData = sign(key.getBytes(DEFAULT_ENCODING), data.getBytes(DEFAULT_ENCODING), macInstance, - LOCK, ALGORITHM); + byte[] signData = sign(key.getBytes(DEFAULT_ENCODING), data.getBytes(DEFAULT_ENCODING), getMac(), + LOCK, ALGORITHM); return BinaryUtil.toBase64String(signData); } catch (UnsupportedEncodingException ex) { throw new RuntimeException("Unsupported algorithm: " + DEFAULT_ENCODING, ex); @@ -62,6 +66,22 @@ public String computeSignature(String key, String data) { } public byte[] computeHash(byte[] key, byte[] data) { - return sign(key, data, macInstance, LOCK, ALGORITHM); + return sign(key, data, getMac(), LOCK, ALGORITHM); + } + + public Mac getMac() { + return reference.get(); + } + + private static class MacThreadLocal extends ThreadLocal { + + @Override + protected Mac initialValue() { + try { + return Mac.getInstance(HmacSHA256Signature.ALGORITHM); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Unsupported algorithm: " + HmacSHA256Signature.ALGORITHM, e); + } + } } } \ No newline at end of file