style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

ECRYPTAR AES

EXISTE UN JAR PARA ECRYPTAR EN AES 256 EN JAVA

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Es pregunta?

Es pregunta?

Imagen de ezamudio

De hecho en el JDK viene incluido AES.

Cipher aes = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec key = new SecretKeySpec(bytes_llave, "AES");
IvParameterSpec iv = new IvParameterSpec(bytes_sal);
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] plaintext = //bytes a cifrar
byte[] buf = cipher.doFinal(plaintext);

Gracias ezamudio

la idea es esta, mis usuarios al digitar su clave la encrypto y viaja encriptada por la red y de ese modo la guardo en base de datos oracle.
no se cual seria la mejor forma de implementar un login seguro con AES 256 si dejo que oracle haga todo ese proceso o desde java mando mi trama con la clave ya ecriptada???

ESTE CODIGO FUNCIONA GRACIAS A EZAMUDIO

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ac75.police;

/**
 *
 * @author fabio.rojas
 */

import java.security.*;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.*;
 
public class AlgoritmoAES {
 
 private byte[] keyValue;

    public AlgoritmoAES() {
    }
 
 
 public AlgoritmoAES(byte[] password) {
 keyValue = password;
 }
 private static String ALGORITHM = "AES";
 
 public String encriptar(String valorEncriptar) throws Exception {
 Key clave = generarClave();
 Cipher c = Cipher.getInstance(ALGORITHM);
 c.init(Cipher.ENCRYPT_MODE, clave);
 byte[] encValor = c.doFinal(valorEncriptar.getBytes());
 String valorEncriptado = new BASE64Encoder().encode(encValor);
 return valorEncriptado;
 }
 
 public String desencriptar(String valorEncriptado) throws Exception {
 Key clave = generarClave();
 Cipher c = Cipher.getInstance(ALGORITHM);
 c.init(Cipher.DECRYPT_MODE, clave);
 byte[] valorDecodificado = new BASE64Decoder().decodeBuffer(valorEncriptado);
 byte[] decValor = c.doFinal(valorDecodificado);
 String valorDesencriptado = new String(decValor);
 return valorDesencriptado;
 }
 
 private Key generarClave() throws Exception {
 Key clave = new SecretKeySpec(keyValue, ALGORITHM);
 return clave;
 }
 
}

Imagen de ezamudio

pero...

qué es lo que estás haciendo ahí? hablaste en tu comentario anterior de cifrar passwords... AES es un algoritmo simétrico, y los passwords no deberían cifrarse de esa manera, a menos que sea absolutamente necesario que se puedan descifrar en el server (no me imagino para qué). Los passwords generalmente se deben digerir, con algo como SHA1 o SHA256 o aunque sea MD5. Lee el estándar PKCS5 o busca algo de PBE (Password-Based Encryption).

Porque aquí veo que hay un método "mágico" generarClave(), no tengo idea de cómo genera la llave pero pues para que se pueda cifrar y descifrar simplemente invocando ese método que no recibe ningún parámetro, me imagino que SIEMPRE genera la misma llave. Y pues usar la misma llave para cifrar datos de todos los usuarios o no usar nada y mandar todo en claro, es lo mismo.

El consejo más importante: no trates de inventar tu propio esquema de seguridad. Otra vez:No. Trates. De. Inventar. Tu. Propio. Esquema. De. Seguridad. Va a ser débil, impráctico, vulnerable, ineficiente... en fin. Mejor usa los algoritmos, mecanismos, esquemas, etc que ya han sido probados y que son estándares y para los cuales incluso hay bibliotecas que puedes usar, ya sea dentro del JDK o de terceros.

Piensa bien tu problema, plantea los requerimientos de seguridad y busca algo que realmente resuelva el problema. Este código que cifra datos usando AES siempre con la misma llave, en realidad sólo da la ilusión de seguridad pero es peor que no usar nada.

EDIT: ya vi el método generarClave(). Me imagino que esos bytes que recibes son un password en texto. Esto es de lo que estoy hablando; no se debe usar un password de texto así nomás como llave, porque entonces el espacio de llaves queda gravemente reducido. Hay que procesar ese password para generar realmente una llave numérica más fuerte. Lee acerca de PBE para generar buenas llaves a partir de un password. La llave para cada usuario debe ser única, incluso si dos usuarios tienen el mismo password, la llave que se genera debe ser distinta para cada uno.

OK SEGUN LO QUE ME MANDASTES A LEER

ok ezamudio lo que lei y me documente es que un logueo por ejemplo no recomienda usar algoritmos de encryptacion simetricos sino asimetricos, ya que si uso simetrico doy la posibilidad que si sacan la llave magica por decirlo de alguna manera pueden sacar la clave de ahi ezamudio son tu comentarios de que estas haciendo!!!... ya que siempre uso la misma llave magica, por lo que entendi si uso AES256 es que cada usuario se le genere y almace su propia llave magica con su password generado.

tu me dices algo que no te entiendo es que los password deben ser digeridos SHA1 o SHA256 o aunque sea MD5
bueno pues me documente y lei algo sobre sha 256.

sha 256
---------------------------------------

 String password22="hackchan25642589"; //esta clave seria el password que digita el usuario  + su DNI  para evitar que me genere dos claves iguales
MessageDigest sha256=MessageDigest.getInstance("SHA-256");
sha256.update(password22.getBytes("UTF-8"));
byte[] digest = sha256.digest();
StringBuffer sb=new StringBuffer();
for(int i=0;i<digest.length;i++){
    sb.append(String.format("%02x", digest[i]));
}
String hash=sb.toString();
        System.out.println(hash); //clave generada
    }

a partir de esta clave generada cual seria el paso a seguir???

A). con esa llave generada con sha 256 genero un AES 256 y la mando a oracle para que almacene la clave AES??

B). mando esa llave generada al server y en oracle se encargue de generar el AES.

c). no uso AES

D). o cual serial realmente el paso a seguir para que me quede una buena seguridad de claves de los usuarios

Imagen de ezamudio

no sé

No sé cuál es el paso a seguir porque no sé qué es lo que quieres lograr.

Si simplemente quieres almacenar los passwords de los usuarios de una forma segura, entonces C:no usas AES.

Cuando necesites validar el password, haces el mismo proceso y comparas el resultado con lo que tienes almacenado.

Si alguien no autorizado le echa ojo a tu tabla de usuarios, no tiene los passwords de los usuarios en una forma que le sirvan de algo.

El único problema es cuando un usuario olvida su password; no se lo puedes dar porque no lo sabes. Por lo tanto necesitas un proceso de "olvidé mi password" donde el usuario pueda poner otro password sin tener el anterior pero que no se preste para que un atacante se robe cuentas de usuarios.

Ahora, si lo que quieres es establecer un canal de comunicación segura, utiliza SSL.

using 256-bit AES con Cipher Block Chaining y PKCS#

SET SERVEROUTPUT ON
comparto aqui simplemente encrypto y desncryto  esto es codigo pl-sql aqui si aplico el script y encrypto la palabra hackchan me genera esta clave
D9D704C9E5FBFBC40B06A12C927F90E9 -> me genero una clave de 32 bytes * 8 256 bits ahora quiero generar esto en java pero no me da igual :(

DECLARE
   input_string       VARCHAR2 (200) :=  'hackchan';
   output_string      VARCHAR2 (200);
   encrypted_raw      RAW (2000);          
   decrypted_raw      RAW (2000);            
   num_key_bytes      NUMBER := 256/8;      
   key_bytes_raw      RAW (32);          
   encryption_type    PLS_INTEGER :=        
                            DBMS_CRYPTO.ENCRYPT_AES256
                          + DBMS_CRYPTO.CHAIN_CBC
                          + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
   DBMS_OUTPUT.PUT_LINE ( 'Cadena Original: ' || input_string);
   key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
   encrypted_raw := DBMS_CRYPTO.ENCRYPT
      (
         src => UTL_I18N.STRING_TO_RAW (input_string,  'AL32UTF8'),
         typ => encryption_type,
         key => key_bytes_raw
      );
    -- The encrypted value "encrypted_raw" can be used here
 
   decrypted_raw := DBMS_CRYPTO.DECRYPT
      (
         src => encrypted_raw,
         typ => encryption_type,
         key => key_bytes_raw
      );
   output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
 
   DBMS_OUTPUT.PUT_LINE ('Decrypted string: ' || encrypted_raw);
END;

Si alguien no autorizado le echa ojo a tu tabla de usuarios

ezamudio si alguien copia la clave generada no es lo mismo que que copiara la clave???

Imagen de ezamudio

Pues...

Supongo que por "clave generada" te refieres a la digestión del password que está almacenada en la base de datos. Qué puedo hacer yo con ese dato? Depende... si lo estás usando como llave para cifrar datos del usuario pues obviamente podré descifrarlos. Pero si sólo es para darle acceso al sistema al usuario, no me sirve de nada, porque no tengo manera de obtener el password original a partir de ese dato (ese es el objetivo de usar una digestión en vez de cifrado). No lo puedo usar para hacerme pasar por ese usuario.

Ahora que si ya me metí a tu base de datos pues hay toda una serie de problemas además de esto, pero para el día a día sirve también para que los usuarios tengan la tranquilidad de que el DBA o cualquier persona autorizada para ver esos datos no va a abusar de ellos, por ejemplo intentar usar el mismo password para entrar a otro sitio con la misma cuenta, etc. El personal autorizado no puede conocer los passwords que están almacenados.

Ayuda

disculpa me podrias ayudar con el siguiente blog alli publique mi codigo es de ajax y jsp al momento de guardar imagenes en una carpeta especifica de mi pc gracias

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">