Advertisement
Guest User

Untitled

a guest
Jul 6th, 2018
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.24 KB | None | 0 0
  1. import org.apache.commons.codec.binary.Hex;
  2. import org.assertj.core.api.SoftAssertions;
  3.  
  4. import javax.crypto.Mac;
  5. import javax.crypto.spec.SecretKeySpec;
  6. import java.io.UnsupportedEncodingException;
  7. import java.security.MessageDigest;
  8. import java.security.NoSuchAlgorithmException;
  9. import java.text.DateFormat;
  10. import java.text.SimpleDateFormat;
  11. import java.time.LocalDate;
  12. import java.time.format.DateTimeFormatter;
  13. import java.util.Calendar;
  14. import java.util.Date;
  15. import java.util.TimeZone;
  16.  
  17.  
  18. public class Test
  19. {
  20.     private static String region = "us-east-1";
  21.     static byte[] HmacSHA256(String data, byte[] key) throws Exception {
  22.         String algorithm="HmacSHA256";
  23.         Mac mac = Mac.getInstance(algorithm);
  24.         mac.init(new SecretKeySpec(key, algorithm));
  25.         return mac.doFinal(data.getBytes("UTF8"));
  26.     }
  27.  
  28.     public static byte[] justSha256(String data) throws NoSuchAlgorithmException, UnsupportedEncodingException {
  29.         MessageDigest digest = MessageDigest.getInstance("SHA-256");
  30.         byte[] hash = digest.digest(data.getBytes("UTF8"));
  31.         return hash;
  32.     }
  33.  
  34.     static byte[] getSigningKey(String key, String dateStamp, String regionName, String serviceName) throws Exception {
  35.         byte[] kSecret = ("AWS4" + key).getBytes("UTF8");
  36.  
  37.  
  38.         byte[] kDate = HmacSHA256(dateStamp, kSecret);
  39.  
  40.         byte[] kRegion = HmacSHA256(regionName, kDate);
  41.  
  42.         byte[] kService = HmacSHA256(serviceName, kRegion);
  43.  
  44.         byte[] kSigning = HmacSHA256("aws4_request", kService);
  45.  
  46.         return kSigning;
  47.     }
  48.  
  49.  
  50.  
  51.     public static String getSimpleDate()
  52.     {
  53.         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYYMMdd");
  54.  
  55.  
  56.         return LocalDate.now().format(formatter);
  57.     }
  58.  
  59.     public static String getAMZDate()
  60.     {
  61.     /*DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYYMMDDHHMMSS");
  62.     String timeStamp = new SimpleDateFormat("YYMMDD'T'HHMMSS'Z'").format(Calendar.getInstance().getTime());*/
  63.  
  64.  
  65.         TimeZone tz = TimeZone.getTimeZone("UTC");
  66.         DateFormat df = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
  67.         df.setTimeZone(tz);
  68.         String timeStamp = df.format(new Date());
  69.  
  70.  
  71.         return timeStamp;
  72.     }
  73.  
  74.  
  75.  
  76.     public static String createSigningString(String timeStamp, String simpleDate,String serviceName) throws UnsupportedEncodingException, NoSuchAlgorithmException {
  77.  
  78.       /*AWS4-HMAC-SHA256
  79.       20150830T123600Z
  80.       20150830/us-east-1/iam/aws4_request
  81.       f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59*/
  82.  
  83.         String algorithm = "AWS4-HMAC-SHA256\n";
  84.         String amzDate = timeStamp+"\n";
  85.         String simpleDateRegionServiceRequest = simpleDate+"/"+region+"/"+serviceName+"/"+"aws4_request\n";
  86.  
  87.         String canonicalHash = getCanonicalHash(getCanonicalString("GET","/","Action=ListUsers&Version=2010-05-08","20150830T123600Z",""));
  88.  
  89.         String signingString = algorithm+amzDate+simpleDateRegionServiceRequest+canonicalHash;
  90.  
  91.  
  92.  
  93.         return signingString;
  94.  
  95.     }
  96.  
  97.     public static String getCanonicalString(String method, String absolutePath, String queryString, String timeStamp, String payload) throws UnsupportedEncodingException, NoSuchAlgorithmException {
  98.  
  99.         String contentType = "Content-Type:application/x-www-form-urlencoded; charset=utf-8\n".toLowerCase();
  100.         String hostUrl = "host:iam.amazonaws.com\n";
  101.         String date = "x-amz-date:"+timeStamp+"\n";
  102.  
  103.         String signedHeader = "content-type;host;x-amz-date\n";
  104.  
  105.         String hashedPayload = Hex.encodeHexString(justSha256(payload)).toLowerCase();
  106.  
  107.  
  108.  
  109.         String canonicalString = method+"\n"+absolutePath+"\n"+queryString+"\n"+contentType+hostUrl+date+"\n"+signedHeader+hashedPayload;
  110.  
  111.  
  112.  
  113.  
  114.         return canonicalString;
  115.     }
  116.  
  117.  
  118.     public static String getCanonicalHash(String canonicalString) throws UnsupportedEncodingException, NoSuchAlgorithmException {
  119.         return Hex.encodeHexString(justSha256(canonicalString)).toLowerCase();
  120.     }
  121.  
  122.  
  123.  
  124.  
  125.     public static void main(String[] args) throws Exception {
  126.  
  127.  
  128.         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYYMMDDHHMMSS");
  129.         String timeStamp = new SimpleDateFormat("YYYYMMDD'T'HHMMSS'Z'").format(Calendar.getInstance().getTime());
  130.  
  131.  
  132.         String canonString;
  133.         System.out.println( canonString = getCanonicalHash(getCanonicalString("GET","/","Action=ListUsers&Version=2010-05-08","20150830T123600Z","")));
  134.  
  135.         String signingString = createSigningString("20150830T123600Z","20150830","iam");
  136.  
  137.         String key = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY";
  138.         String dateStamp = "20120215";
  139.         String regionName = "us-east-1";
  140.         String serviceName = "iam";
  141.  
  142.         String signingKey = Hex.encodeHexString(getSigningKey(key,dateStamp,regionName,serviceName));
  143.  
  144.         SoftAssertions softly = new SoftAssertions();
  145.  
  146.         softly.assertThat(canonString).isEqualToIgnoringCase("f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59");
  147.         String copiedSigningString = "AWS4-HMAC-SHA256\n" +
  148.                 "20150830T123600Z\n" +
  149.                 "20150830/us-east-1/iam/aws4_request\n" +
  150.                 "f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59";
  151.  
  152.  
  153.  
  154.         softly.assertThat(signingString).isEqualTo(copiedSigningString);
  155.  
  156.  
  157.  
  158.         softly.assertThat(signingKey).isEqualToIgnoringCase("f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d");
  159.  
  160.         dateStamp ="20150830";
  161.  
  162.         signingKey = Hex.encodeHexString(getSigningKey(key,dateStamp,regionName,serviceName));
  163.  
  164.         softly.assertThat(signingKey).isEqualToIgnoringCase("c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9");
  165.  
  166.  
  167.         System.out.println("COPIED STRING : "+copiedSigningString);
  168.  
  169.         System.out.println("SIGNING KEY : "+signingKey);
  170.         String signature = Hex.encodeHexString(HmacSHA256(signingKey.trim(),justSha256(copiedSigningString)));
  171.  
  172.         System.out.println("Signature : "+signature);
  173.  
  174.         softly.assertThat(signature).isEqualToIgnoringCase("5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7");
  175.  
  176.         softly.assertAll();
  177.  
  178.     }
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement