This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new dea2498718 refactor SignatureUtils and related usage (#10291)
dea2498718 is described below

commit dea24987186bc3d1585bbf74ba8ea8abc1ef0cfa
Author: cheese8 <[email protected]>
AuthorDate: Mon Jul 11 09:45:26 2022 +0800

    refactor SignatureUtils and related usage (#10291)
---
 .../apache/dubbo/auth/AccessKeyAuthenticator.java  | 27 +++----
 .../apache/dubbo/auth/utils/SignatureUtils.java    | 91 ++++++++++------------
 .../dubbo/auth/AccessKeyAuthenticatorTest.java     |  1 -
 .../dubbo/auth/utils/SignatureUtilsTest.java       | 36 ++-------
 4 files changed, 60 insertions(+), 95 deletions(-)

diff --git 
a/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/AccessKeyAuthenticator.java
 
b/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/AccessKeyAuthenticator.java
index b8ee2f6eda..bddd67c401 100644
--- 
a/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/AccessKeyAuthenticator.java
+++ 
b/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/AccessKeyAuthenticator.java
@@ -38,12 +38,11 @@ public class AccessKeyAuthenticator implements 
Authenticator {
     @Override
     public void sign(Invocation invocation, URL url) {
         String currentTime = String.valueOf(System.currentTimeMillis());
-        String consumer = url.getApplication();
         AccessKeyPair accessKeyPair = getAccessKeyPair(invocation, url);
         invocation.setAttachment(Constants.REQUEST_SIGNATURE_KEY, 
getSignature(url, invocation, accessKeyPair.getSecretKey(), currentTime));
         invocation.setAttachment(Constants.REQUEST_TIMESTAMP_KEY, currentTime);
         invocation.setAttachment(Constants.AK_KEY, 
accessKeyPair.getAccessKey());
-        invocation.setAttachment(CommonConstants.CONSUMER, consumer);
+        invocation.setAttachment(CommonConstants.CONSUMER, 
url.getApplication());
     }
 
     @Override
@@ -52,12 +51,11 @@ public class AccessKeyAuthenticator implements 
Authenticator {
         String requestTimestamp = 
String.valueOf(invocation.getAttachment(Constants.REQUEST_TIMESTAMP_KEY));
         String originSignature = 
String.valueOf(invocation.getAttachment(Constants.REQUEST_SIGNATURE_KEY));
         String consumer = 
String.valueOf(invocation.getAttachment(CommonConstants.CONSUMER));
-
-        if (StringUtils.isEmpty(accessKeyId) || StringUtils.isEmpty(consumer)
-                || StringUtils.isEmpty(requestTimestamp) || 
StringUtils.isEmpty(originSignature)) {
-            throw new RpcAuthenticationException("Failed to authenticate, 
maybe consumer not enable the auth");
+        if (StringUtils.isAnyEmpty(accessKeyId, consumer, requestTimestamp, 
originSignature)) {
+            throw new RpcAuthenticationException("Failed to authenticate, 
maybe consumer side did not enable the auth");
         }
-        AccessKeyPair accessKeyPair = null;
+        
+        AccessKeyPair accessKeyPair;
         try {
             accessKeyPair = getAccessKeyPair(invocation, url);
         } catch (Exception e) {
@@ -75,10 +73,10 @@ public class AccessKeyAuthenticator implements 
Authenticator {
         AccessKeyStorage accessKeyStorage = 
applicationModel.getExtensionLoader(AccessKeyStorage.class)
                 
.getExtension(url.getParameter(Constants.ACCESS_KEY_STORAGE_KEY, 
Constants.DEFAULT_ACCESS_KEY_STORAGE));
 
-        AccessKeyPair accessKeyPair = null;
+        AccessKeyPair accessKeyPair;
         try {
             accessKeyPair = accessKeyStorage.getAccessKey(url, invocation);
-            if (accessKeyPair == null || 
StringUtils.isEmpty(accessKeyPair.getAccessKey()) || 
StringUtils.isEmpty(accessKeyPair.getSecretKey())) {
+            if (accessKeyPair == null || 
StringUtils.isAnyEmpty(accessKeyPair.getAccessKey(), 
accessKeyPair.getSecretKey())) {
                 throw new AccessKeyNotFoundException("AccessKeyId or 
secretAccessKey not found");
             }
         } catch (Exception e) {
@@ -88,16 +86,11 @@ public class AccessKeyAuthenticator implements 
Authenticator {
     }
 
     String getSignature(URL url, Invocation invocation, String secretKey, 
String time) {
+        String requestString = 
String.format(Constants.SIGNATURE_STRING_FORMAT, url.getColonSeparatedKey(), 
invocation.getMethodName(), secretKey, time);
         boolean parameterEncrypt = 
url.getParameter(Constants.PARAMETER_SIGNATURE_ENABLE_KEY, false);
-        String signature;
-        String requestString = String.format(Constants.SIGNATURE_STRING_FORMAT,
-                url.getColonSeparatedKey(), invocation.getMethodName(), 
secretKey, time);
         if (parameterEncrypt) {
-            signature = SignatureUtils.sign(invocation.getArguments(), 
requestString, secretKey);
-        } else {
-            signature = SignatureUtils.sign(requestString, secretKey);
+            return SignatureUtils.sign(invocation.getArguments(), 
requestString, secretKey);
         }
-        return signature;
+        return SignatureUtils.sign(requestString, secretKey);
     }
-
 }
diff --git 
a/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/utils/SignatureUtils.java
 
b/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/utils/SignatureUtils.java
index 7b8b6015fb..babe23c6b9 100644
--- 
a/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/utils/SignatureUtils.java
+++ 
b/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/utils/SignatureUtils.java
@@ -23,75 +23,68 @@ import java.io.IOException;
 import java.io.ObjectOutput;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
-import java.security.SignatureException;
-import java.util.Arrays;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
 import java.util.Base64;
 
 public class SignatureUtils {
     private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
 
-    public static String sign(String metadata, String key) throws 
SecurityException {
-        try {
-            return sign(metadata.getBytes(), key);
-        } catch (Exception e) {
-            throw new SecurityException("Failed to generate HMAC : " + 
e.getMessage(), e);
-        }
+    public static String sign(String metadata, String key) throws 
RuntimeException {
+        return sign(metadata.getBytes(StandardCharsets.UTF_8), key);
     }
 
-    public static String sign(Object[] parameters, String metadata, String 
key) {
-        try {
-            if (parameters == null) {
-                return sign(metadata, key);
-            }
-            boolean notSerializable = 
Arrays.stream(parameters).anyMatch(parameter -> !(parameter instanceof 
Serializable));
-            if (notSerializable) {
-                throw new IllegalArgumentException("");
+    public static String sign(Object[] parameters, String metadata, String 
key) throws RuntimeException {
+        if (parameters == null) {
+            return sign(metadata, key);
+        }
+        for (int i = 0; i < parameters.length; i++) {
+            if (!(parameters[i] instanceof Serializable)) {
+                throw new IllegalArgumentException("The parameter [" + i + "] 
to be signed was not serializable.");
             }
-
-            Object[] includeMetadata = new Object[parameters.length + 1];
-            System.arraycopy(parameters, 0, includeMetadata, 0, 
parameters.length);
-            includeMetadata[parameters.length] = metadata;
-            byte[] bytes = toByteArray(includeMetadata);
-            return sign(bytes, key);
-        } catch (Exception e) {
-            throw new SecurityException("Failed to generate HMAC : " + 
e.getMessage(), e);
         }
+        Object[] includeMetadata = new Object[parameters.length + 1];
+        System.arraycopy(parameters, 0, includeMetadata, 0, parameters.length);
+        includeMetadata[parameters.length] = metadata;
+        byte[] includeMetadataBytes;
+        try {
+            includeMetadataBytes = toByteArray(includeMetadata);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to generate HMAC: " + 
e.getMessage());
+        }
+        return sign(includeMetadataBytes, key);
     }
 
-    public static String sign(byte[] data, String key) throws 
SignatureException {
-        String result;
+    private static String sign(byte[] data, String key) throws 
RuntimeException {
+        Mac mac;
+        try {
+            mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
+        } catch(NoSuchAlgorithmException e) {
+            throw new RuntimeException("Failed to generate HMAC: no such 
algorithm exception " + HMAC_SHA256_ALGORITHM);
+        }
+        SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), 
HMAC_SHA256_ALGORITHM);
         try {
-            Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
-            SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(),
-                    HMAC_SHA256_ALGORITHM);
             mac.init(signingKey);
+        } catch(InvalidKeyException e) {
+            throw new RuntimeException("Failed to generate HMAC: invalid key 
exception");
+        }
+        byte[] rawHmac;
+        try{
             // compute the hmac on input data bytes
-            byte[] rawHmac = mac.doFinal(data);
-            // base64-encode the hmac
-            result = Base64.getEncoder().encodeToString(rawHmac);
-
-        } catch (Exception e) {
-            throw new SignatureException("Failed to generate HMAC : "
-                    + e.getMessage());
+            rawHmac = mac.doFinal(data);
+        } catch (IllegalStateException e) {
+            throw new RuntimeException("Failed to generate HMAC: " + 
e.getMessage());
         }
-        return result;
+        // base64-encode the hmac
+        return Base64.getEncoder().encodeToString(rawHmac);
     }
 
-    static byte[] toByteArray(Object[] parameters) throws Exception {
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        ObjectOutput out = null;
-        try {
-            out = new ObjectOutputStream(bos);
+    private static byte[] toByteArray(Object[] parameters) throws IOException {
+        try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ObjectOutput out = new ObjectOutputStream(bos)) {
             out.writeObject(parameters);
             out.flush();
             return bos.toByteArray();
-        } finally {
-            try {
-                bos.close();
-            } catch (IOException ex) {
-                // ignore close exception
-            }
         }
     }
-
 }
diff --git 
a/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/AccessKeyAuthenticatorTest.java
 
b/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/AccessKeyAuthenticatorTest.java
index c12c3131d2..bc9b8f939b 100644
--- 
a/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/AccessKeyAuthenticatorTest.java
+++ 
b/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/AccessKeyAuthenticatorTest.java
@@ -133,6 +133,5 @@ class AccessKeyAuthenticatorTest {
         when(invocation.getArguments()).thenReturn(fakeParams);
         String signature1 = helper.getSignature(url, invocation, secretKey, 
String.valueOf(System.currentTimeMillis()));
         assertNotEquals(signature, signature1);
-
     }
 }
diff --git 
a/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/utils/SignatureUtilsTest.java
 
b/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/utils/SignatureUtilsTest.java
index 07d22b670b..d6bbae6e47 100644
--- 
a/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/utils/SignatureUtilsTest.java
+++ 
b/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/utils/SignatureUtilsTest.java
@@ -16,43 +16,23 @@
  */
 package org.apache.dubbo.auth.utils;
 
-
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.ArrayList;
-import java.util.List;
 
 public class SignatureUtilsTest {
 
-
-    private Object[] objects = new Object[2];
-    private List<String> list = new ArrayList<>();
-    private String temp = "temp";
-    private String key = "TOKEN";
-
-    {
-        objects[0] = list;
-        objects[1] = temp;
-    }
-
     @Test
-    void testObjectToByteArray() {
-
-        try {
-            byte[] bytes = SignatureUtils.toByteArray(objects);
-            Assertions.assertNotEquals(0, bytes.length);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+    void testEncryptWithObject() {
+        Object[] objects = new Object[] {new ArrayList<>(), "temp"};
+        String encryptWithObject = SignatureUtils.sign(objects, 
"TestMethod#hello", "TOKEN");
+        Assertions.assertEquals(encryptWithObject, 
"t6c7PasKguovqSrVRcTQU4wTZt/ybl0jBCUMgAt/zQw=");
     }
-
+    
     @Test
-    void testEncryptObject() {
-        String encrypt = SignatureUtils.sign(objects, "TestMethod#hello", key);
-        String encryptNoParams = SignatureUtils.sign(null, "TestMethod#hello", 
key);
-        Assertions.assertNotNull(encrypt);
-        Assertions.assertNotNull(encryptNoParams);
-        Assertions.assertNotEquals(encrypt, encryptNoParams);
+    void testEncryptWithNoParameters() {
+        String encryptWithNoParams = SignatureUtils.sign(null, 
"TestMethod#hello", "TOKEN");
+        Assertions.assertEquals(encryptWithNoParams, 
"2DGkTcyXg4plU24rY8MZkEJwOMRW3o+wUP3HssRc3EE=");
     }
 }

Reply via email to