code: private final byte[] deriveSigningKey(AWSCredentials credentials,
              AWS4SignerRequestParams signerRequestParams) {
  
          final String cacheKey = computeSigningCacheKeyName(credentials,
                  signerRequestParams);
          final long daysSinceEpochSigningDate = DateUtils
                  .numberOfDaysSinceEpoch(signerRequestParams
                          .getSigningDateTimeMilli());
  
          SignerKey signerKey = signerCache.get(cacheKey);
  
          if (signerKey != null) {
              if (daysSinceEpochSigningDate == signerKey
                      .getNumberOfDaysSinceEpoch()) {
                  return signerKey.getSigningKey();
              }
          }
          if (log.isDebugEnabled()) {
              log.debug("Generating a new signing key as the signing key not available in the cache for the date "
                      + TimeUnit.DAYS.toMillis(daysSinceEpochSigningDate));
          }
          byte[] signingKey = newSigningKey(credentials,
                  signerRequestParams.getFormattedSigningDate(),
                  signerRequestParams.getRegionName(),
                  signerRequestParams.getServiceName());
          signerCache.add(cacheKey, new SignerKey(
                  daysSinceEpochSigningDate, signingKey));
          return signingKey;
      }
docs: Step 3 of the AWS Signature version 4 calculation. It involves deriving
  the signing key and computing the signature. Refer to
  http://docs.aws.amazon
  .com/general/latest/gr/sigv4-calculate-signature.html