secreta descargar clave aws acceso amazon-web-services coldfusion amazon-kms

amazon web services - descargar - ¿Cómo obtener una clave de inicio de sesión para AWS Signature Version 4(en ColdFusion)?



clave de acceso secreta amazon (3)

<cfset var kRegion = sign( arguments.regionName, kDate ) />

Estoy sorprendido de que el código se ejecute sin error, ya que la función sign() espera dos cadenas, pero el código en realidad está pasando una matriz de bytes para el segundo parámetro. (Bajo CF11 arroja un error). Tal vez hay algún tipo de conversión implícita pasando? De todos modos, después de refactorizar ligeramente las funciones, el ejemplo funcionó bien con una excepción. La última línea del ejemplo utiliza la cadena literal "aws4_request" en lugar de "arguments.serviceName". Vea el ejemplo a continuación.

Habiendo dicho eso, ¿Railo no tiene una función HMAC que puedes usar en lugar de hacer tu propia? Supongo que sí, ya que HMAC () está incluido en CF10 +. Actualización: Como vrtjason anotó en los comentarios , Railo agregó la función HMAC() en 4.0.0.011 . Sin embargo, para compatibilidad con versiones anteriores, la siguiente versión de java debería funcionar con la mayoría de las versiones.

Ejemplo:

result = getSignatureKey(key, dateStamp, regionName, serviceName); writeDump( binaryEncode(result, "hex") );

Resultados:

F4780E2D9F65FA895F9C67B32CE1BAF0B0D8A43505A000A1A9E090D414DB404D

Funciones:

<cffunction name="getSignatureKey" returntype="binary" access="private" output="false" hint="Derive the sign-in key"> <cfargument name="key" type="string" required="true" /> <cfargument name="dateStamp" type="string" required="true" /> <cfargument name="regionName" type="string" required="true" /> <cfargument name="serviceName" type="string" required="true" /> <cfset Local.kSecret = charsetDecode("AWS4" & arguments.key, "UTF-8") /> <cfset Local.kDate = sign( arguments.dateStamp, Local.kSecret ) /> <cfset Local.kRegion = sign( arguments.regionName, Local.kDate ) /> <cfset Local.kService = sign( arguments.serviceName, Local.kRegion ) /> <cfset Local.kSigning = sign( "aws4_request", Local.kService ) /> <cfreturn Local.kSigning /> </cffunction> <cffunction name="sign" returntype="binary" access="private" output="false" hint="Sign with NSA SHA-256 Algorithm"> <cfargument name="message" type="string" required="true" /> <cfargument name="key" type="binary" required="true" /> <cfargument name="algorithm" type="string" default="HmacSHA256" /> <cfargument name="encoding" type="string" default="UTF-8" /> <cfset Local.keySpec = createObject("java","javax.crypto.spec.SecretKeySpec") /> <cfset Local.keySpec = Local.keySpec.init( arguments.key, arguments.algorithm ) /> <cfset Local.mac = createObject("java","javax.crypto.Mac").getInstance( arguments.algorithm ) /> <cfset Local.mac.init( Local.keySpec ) /> <cfreturn Local.mac.doFinal( charsetDecode(arguments.message, arguments.encoding ) ) /> </cffunction>

Intento utilizar ColdFusion para acceder a Amazon Web Services (AWS) utilizando su método de autenticación actual conocido como Signature Version 4. He consultado su documentación, que tiene ejemplos de código para varios lenguajes de programación , así como pseudocódigo para otros idiomas . Proporcionaron algunos valores de entrada de prueba para pasar a la función de firma de mi script, y también algunos resultados esperados.

Aquí están las entradas de prueba:

key = ''wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'' dateStamp = ''20120215'' regionName = ''us-east-1'' serviceName = ''iam''

Aquí están los resultados esperados:

kSecret = ''41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559'' kDate = ''969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d'' kRegion = ''69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c'' kService = ''f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'' kSigning = ''f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d''

El valor correcto para "kSigning" debería ser este:

f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d

Sin embargo, para "kSigning" mi código genera esto:

31A84DCE0538A8B15ED68CCFBD803F17947E41BF625EFFD1AD6A67FC821F9BE2

Estoy usando Railo 4.2. ¿Puede alguien ayudarme a resolver esto, para que el valor anticipado coincida con el valor objeto de dumping? Aquí está mi marcado de ColdFusion:

<cfsilent> <!--- HMACSHA256 ---> <cffunction name="sign" returntype="binary" access="private" output="false" hint="Sign with NSA SHA-256 Algorithm"> <cfargument name="signMessage" type="string" required="true" /> <cfargument name="signKey" type="string" required="true" /> <cfset var jMsg = JavaCast("string",arguments.signMessage).getBytes("utf-8") /> <cfset var jKey = JavaCast("string",arguments.signKey).getBytes("utf-8") /> <cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec") /> <cfset var mac = createObject("java","javax.crypto.Mac") /> <cfset key = key.init(jKey,"HmacSHA256") /> <cfset mac = mac.getInstance(key.getAlgorithm()) /> <cfset mac.init(key) /> <cfreturn mac.doFinal(jMsg) /> </cffunction> <!--- Get Signature Key ---> <cffunction name="getSignatureKey" returntype="binary" access="private" output="false" hint="Derive the sign-in key"> <cfargument name="key" type="string" required="true" /> <cfargument name="dateStamp" type="string" required="true" /> <cfargument name="regionName" type="string" required="true" /> <cfargument name="serviceName" type="string" required="true" /> <cfset var kSecret = "AWS4" & arguments.key /> <cfset var kDate = sign( arguments.dateStamp, kSecret ) /> <cfset var kRegion = sign( arguments.regionName, kDate ) /> <cfset var kService = sign( arguments.serviceName, kRegion ) /> <cfset var kSigning = sign( arguments.serviceName, kService ) /> <cfreturn kSigning /> </cffunction> </cfsilent><!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>AWS Test</title> </head> <body> <cfset kSecret = getSignatureKey( ''wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'', ''20120215'', ''us-east-1'', ''iam'' ) /> <cfdump var="#BinaryEncode(kSecret, ''hex'')#" label="kSecret" /> </body> </html>


Creo que puede hacer esto en ColdFusion 10+ utilizando la función incorporada HMAC () sin necesidad de crear un objeto Java:

function getSignatureKey(key, dateStamp, regionName, serviceName) { var kDate= lCase(HMAC(ARGUMENTS.dateStamp,"AWS4" & ARGUMENTS.key,"hmacsha256")); var kRegion= lCase(HMAC(ARGUMENTS.regionName,binaryDecode(kDate,''hex''),"hmacsha256")); var kService=lCase(HMAC(ARGUMENTS.serviceName,binaryDecode(kRegion,''hex''),"hmacsha256")); var kSigning= lCase(HMAC("aws4_request",binaryDecode(kService,''hex''),"hmacsha256")); return kSigning; }


Veo un problema y espero que lo veas también cuando notes lo similares que son estas dos líneas:

<cfset var kService = sign( arguments.serviceName, kRegion ) /> <cfset var kSigning = sign( arguments.serviceName, kService ) />

Alerta de bandera roja, ¿tiene sentido cambiar el nombre del servicio dos veces?

La entrada al último paso es un literal de cadena.

<cfset var kSigning = sign( "aws4_request", kService ) />