possibilité d'afficher la version cryptée avec AES d'un mot de passe
This commit is contained in:
		
							parent
							
								
									6353686d4a
								
							
						
					
					
						commit
						704f34029b
					
				
							
								
								
									
										125
									
								
								upassword
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								upassword
									
									
									
									
									
								
							@ -4,6 +4,7 @@ compiler=javac
 | 
			
		||||
mainClass=upassword
 | 
			
		||||
compileAndGo
 | 
			
		||||
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.PrintWriter;
 | 
			
		||||
import java.io.StringWriter;
 | 
			
		||||
import java.io.UnsupportedEncodingException;
 | 
			
		||||
@ -15,6 +16,12 @@ import java.util.List;
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
import javax.crypto.Cipher;
 | 
			
		||||
import javax.crypto.SecretKey;
 | 
			
		||||
import javax.crypto.SecretKeyFactory;
 | 
			
		||||
import javax.crypto.spec.PBEKeySpec;
 | 
			
		||||
import javax.crypto.spec.SecretKeySpec;
 | 
			
		||||
 | 
			
		||||
public class upassword {
 | 
			
		||||
    public static final String UTF_8 = "UTF-8";
 | 
			
		||||
 | 
			
		||||
@ -86,6 +93,7 @@ public class upassword {
 | 
			
		||||
        }
 | 
			
		||||
        return ba;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static final boolean strIsempty(String str) {
 | 
			
		||||
        return str == null || str.length() == 0;
 | 
			
		||||
    }
 | 
			
		||||
@ -4542,6 +4550,81 @@ public class upassword {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // ------------------------------------------------------------------------
 | 
			
		||||
    public static class AESEnc {
 | 
			
		||||
        private static final String AES = "AES";
 | 
			
		||||
 | 
			
		||||
        private static final String CIPHER = "AES/ECB/PKCS5Padding";
 | 
			
		||||
 | 
			
		||||
        public static final byte[] genkey(String password, byte[] salt, int iterations)
 | 
			
		||||
                throws Exception {
 | 
			
		||||
            if (salt == null) salt = Salt.getInstance().newBinarySalt();
 | 
			
		||||
            if (iterations <= 0) iterations = 10000;
 | 
			
		||||
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
 | 
			
		||||
            SecretKey tmp = factory.generateSecret(new PBEKeySpec(password.toCharArray(), salt,
 | 
			
		||||
                    iterations, 128));
 | 
			
		||||
            SecretKeySpec key = new SecretKeySpec(tmp.getEncoded(), AES);
 | 
			
		||||
            return key.getEncoded();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final byte[] genkey(String password) throws Exception {
 | 
			
		||||
            return genkey(password, null, -1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final String genskey(String password, byte[] salt, int iterations)
 | 
			
		||||
                throws Exception {
 | 
			
		||||
            return Base64.encodeBytes(genkey(password, salt, iterations));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final String genskey(String password) throws Exception {
 | 
			
		||||
            return Base64.encodeBytes(genkey(password));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final byte[] getKey(String skey) {
 | 
			
		||||
            return Base64.decode(skey);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final byte[] encrypt(byte[] clear, byte[] key) throws Exception {
 | 
			
		||||
            if (clear == null) return null;
 | 
			
		||||
            if (key == null) throw new NullPointerException("key is required");
 | 
			
		||||
 | 
			
		||||
            Cipher aes = Cipher.getInstance(CIPHER);
 | 
			
		||||
            aes.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, AES));
 | 
			
		||||
            return aes.doFinal(clear);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final String sencrypt(String sclear, byte[] key) throws Exception {
 | 
			
		||||
            if (sclear == null) return null;
 | 
			
		||||
            byte[] input = sclear.getBytes(UTF_8);
 | 
			
		||||
            byte[] output = encrypt(input, key);
 | 
			
		||||
            return Base64.encodeBytes(output, Base64.DONT_BREAK_LINES);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final String sencrypt(String sclear, String skey) throws Exception {
 | 
			
		||||
            return sencrypt(sclear, getKey(skey));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final byte[] decrypt(byte[] crypted, byte[] key) throws Exception {
 | 
			
		||||
            if (crypted == null) return null;
 | 
			
		||||
            if (key == null) throw new NullPointerException("key is required");
 | 
			
		||||
 | 
			
		||||
            Cipher aes = Cipher.getInstance(CIPHER);
 | 
			
		||||
            aes.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, AES));
 | 
			
		||||
            return aes.doFinal(crypted);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final String sdecrypt(String scrypted, byte[] key) throws Exception {
 | 
			
		||||
            if (scrypted == null) return null;
 | 
			
		||||
            byte[] input = Base64.decode(scrypted);
 | 
			
		||||
            byte[] output = decrypt(input, key);
 | 
			
		||||
            return new String(output, UTF_8);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final String sdecrypt(String scrypted, String skey) throws Exception {
 | 
			
		||||
            return sdecrypt(scrypted, getKey(skey));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // ------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    private Password getPasswordAnySalt(String clear, String scheme, final String anySalt) {
 | 
			
		||||
@ -4588,10 +4671,42 @@ public class upassword {
 | 
			
		||||
 | 
			
		||||
    private void run(String[] args) {
 | 
			
		||||
        if (args.length == 1 && strEquals(args[0], "--help")) {
 | 
			
		||||
            println("USAGE: upassword [clear [salts...]]");
 | 
			
		||||
            println("USAGE: upassword [-f aeskeyfile] [clear [salts...]]");
 | 
			
		||||
            System.exit(0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        String aeskeyfile = null;
 | 
			
		||||
        if (args.length > 0 && args[0].substring(0, 2).equals("-f")) {
 | 
			
		||||
            String opt = args[0];
 | 
			
		||||
            int shift = 1;
 | 
			
		||||
            if (opt.equals("-f")) {
 | 
			
		||||
                if (args.length > 1) {
 | 
			
		||||
                    aeskeyfile = args[1];
 | 
			
		||||
                    shift = 2;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                aeskeyfile = args[0].substring(2);
 | 
			
		||||
            }
 | 
			
		||||
            String[] newargs = new String[args.length - shift];
 | 
			
		||||
            System.arraycopy(args, shift, newargs, 0, newargs.length);
 | 
			
		||||
            args = newargs;
 | 
			
		||||
        }
 | 
			
		||||
        byte[] aeskey = null;
 | 
			
		||||
        if (aeskeyfile != null) {
 | 
			
		||||
            try {
 | 
			
		||||
                FileInputStream fis = new FileInputStream(aeskeyfile);
 | 
			
		||||
                try {
 | 
			
		||||
                    aeskey = new byte[16];
 | 
			
		||||
                    fis.read(aeskey);
 | 
			
		||||
                } finally {
 | 
			
		||||
                    fis.close();
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                e.printStackTrace(System.err);
 | 
			
		||||
                System.exit(1);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        String clear = null;
 | 
			
		||||
        if (args.length > 0) clear = args[0];
 | 
			
		||||
        String salt = null;
 | 
			
		||||
@ -4619,6 +4734,13 @@ public class upassword {
 | 
			
		||||
            String ssha = getPasswordAnySalt(clear, Password.SSHA, salt).getNormalized();
 | 
			
		||||
            String md5 = getPasswordAnySalt(clear, Password.MD5, salt).getNormalized();
 | 
			
		||||
            String smd5 = getPasswordAnySalt(clear, Password.SMD5, salt).getNormalized();
 | 
			
		||||
            String aes = null;
 | 
			
		||||
            if (aeskey != null) {
 | 
			
		||||
                try {
 | 
			
		||||
                    aes = AESEnc.sencrypt(clear, aeskey);
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            println("clear: " + clear);
 | 
			
		||||
            println("lm:    " + lm);
 | 
			
		||||
@ -4628,6 +4750,7 @@ public class upassword {
 | 
			
		||||
            println("ssha:  " + ssha);
 | 
			
		||||
            println("md5:   " + md5);
 | 
			
		||||
            println("smd5:  " + smd5);
 | 
			
		||||
            if (aes != null) println("aes:   " + aes);
 | 
			
		||||
        } else {
 | 
			
		||||
            // Afficher uniquement les versions cryptées des mots de passe avec
 | 
			
		||||
            // les schemes correspondant aux salts spécifiés, pour chacun des
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user