Search code examples
javaamazon-s3bouncycastlehmacsha1

how to generate s3 style access/secret key using java


I am trying to generate access keys and secret keys in the same fashion as S3 using java but am having some trouble.

As a starting point I am looking at this bouncy castle example , I have this code up and running but am not sure of two things 1) how to set it up to use the same key generation as s3 which uses HMAC-SHA1 as outlined here and 2) how to get the friendly public/private key strings out for the the user.

You may have guessed I am new to java encryption and the bouncy castle libraries, however I did find JCEKeyGenerator.HMACSHA1 in the bc docs but am unable to find an example of its use. Any help would be greatly appreciated.

Thanks.


Solution

  • You'll need to make use of javax.crypto.KeyGenerator to create the AWSAccessKeyId and the AWSSecretAccessKey:

    javax.crypto.KeyGenerator generator = javax.crypto.KeyGenerator.getInstance("HMACSHA1");
    generator.init(120);
    byte[] awsAccessKeyId = generator.generateKey().getEncoded();
    generator.init(240);
    byte[] awsSecretAccessKey = generator.generateKey().getEncoded();
    

    Then, you'll want to base64 encode the bytes (this uses MimeUtility from mail.jar):

    final ByteArrayOutputStream encoded = new ByteArrayOutputStream();
    final OutputStream encoder = javax.mail.internet.MimeUtility.encode(encoded, "base64");
    encoder.write(awsAccessKeyId);
    encoder.flush();
    encoder.close();
    String accessKeyId = new String(encoded.toByteArray(), encoding).replaceAll("[\\r\\n]", "");