HMAC SHA-1 en Java
En una de las integraciones que realicé como opciones de pago en internet fue la implementación de Multipagos en un sitio web, una de las peculiaridades de esta plataforma es que pide un algoritmo de encriptacion llamado HMAC SHA-1 ¿cómo se implementa este algoritmo en java? este algoritmo en java se implementa como se muestra a continuacion:
public String Sha_1(String llave, String cadena) throws NoSuchAlgorithmException,InvalidKeyException{ String hmac = ""; Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec secret = new SecretKeySpec(llave.getBytes(), "HmacSHA1"); mac.init(secret); byte[] digest = mac.doFinal(cadena.getBytes()); BigInteger hash = new BigInteger(1, digest); hmac = hash.toString(16); if (hmac.length() % 2 != 0) { hmac = "0" + hmac; } return hmac; }
se importan :
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
JavaScript Visual QuickStart Guide 8th Edition
Header http://schemas.xmlsoap.org/ws/2004/08/addressing:Action for ultimate recipient is required but not present in the message.
Estuve varios días atorado con este error, al final resolví de esta forma:
El caso es que tenia que consumir un WS desarrollado con tecnología .NET el xml para hacer la peticion es el siguiente:
<?xml version='1.0' encoding='UTF-8'?> <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> <soapenv:Header xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsse:UsernameToken> <wsse:Username>XXXXX</wsse:Username> <wsse:Password>00-XX-E3-XX-A8-XX</wsse:Password> </wsse:UsernameToken> </wsse:Security> <wsa:To>http://localhost:8080/cancel/C_NC.asmx</wsa:To> <wsa:ReplyTo> <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address> </wsa:ReplyTo> <wsa:MessageID>urn:uuid:B16B96BDBCE68573161314043379608</wsa:MessageID> <wsa:Action>http://tempuri.org/ProcesaCancelacion_NotaDeCredito</wsa:Action> </soapenv:Header> <soapenv:Body> <ns1:ProcesaCancelacion_NotaDeCredito xmlns:ns1="http://tempuri.org/"> <ns1:Boleto>XXXX</ns1:Boleto> <ns1:FechaBoleto>03-08-2011</ns1:FechaBoleto> <ns1:ImporteBoleto>????6</ns1:ImporteBoleto> <ns1:ImporteIVA>0</ns1:ImporteIVA> </ns1:ProcesaCancelacion_NotaDeCredito> </soapenv:Body> </soapenv:Envelope>
El cliente lo desarrollé en java con AXIS2 utilizando WSDL2JAVA.
axis2 por default tiene como wsa=”http://www.w3.org/2005/08/addressing” y yo necesitaba wsa=”http://schemas.xmlsoap.org/ws/2004/08/addressing”
Aparte de agregar los headers de seguridad tenia que cambiar el valor de wsa y eso se hace de la siguiente forma:
XxxStub xxxStub = new XxxStub(); xxxStub._getServiceClient().getOptions().setProperty(AddressingConstants. WS_ADDRESSING_VERSION, AddressingConstants.Submission.WSA_NAMESPACE); xxxStub._getServiceClient().getOptions().setProperty("INCLUDE_OPTIONAL_HEADERS", Boolean.TRUE);
La primera instrucción instancias el stub, la segunda instrucción es para cambiar la versión del wsa y la tercera es para que acepte el cambio.
modulo de autenticacion con Java
Buscando en la red un modulo que me ayudara a validar el password que se le pide al usuario para crear una cuenta me encontre con esto, con unas ligeras modificaciones sirvio a mis propositos.
public class autentifica extends JFrame implements ActionListener{ JPasswordField contraseña = new JPasswordField("",10); JTextField usuario = new JTextField("",10); JButton entrar=new JButton("Entrar"); entrar.addActionListener(this); public void actionPerformed(ActionEvent e){ Object fuente = e.getSource(); if (fuente==entrar){ if(authenticate()){ //Doy acceso al frame principal y a la base de datos } } public boolean authenticate() { String user = usuario.getText(); char passArray[] = contraseña.getPassword(); for (int i = 0; i < passArray.length; i++) { char c = passArray[i]; if (!Character.isLetterOrDigit(c)) return false; } String pass = new String(passArray); if ((user.equals("Patricia") && pass.equals("competencias"))||(user.equals("admin") && pass.equals("admin"))) { return true; } else { return false; } } }
;
Tutorial de javascript
Esta página es una buena fuente de información para todos aquellos que tengan dudas sobre javascript chequenla:

