• java 加密


    加密。大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密。

    双向加密大体意思就是明文加密后形成密文,能够通过算法还原成明文。
    单向加密仅仅是对信息进行了摘要计算,不能通过算法生成明文。

    双向加密

    对称加密

    密钥是控制加密及解密过程的指令。

    加密和解密使用同样密钥。也称为单密钥加密, 对称式加密本身不是安全的。  
    经常使用的对称加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等。

    DES被成为美国数据加密标准,是1972年美国IBM公司研制的对称password体制加密算法。

    AES高级加密标准(Advanced Encryption Standard),是美国联邦政府採用的一种区块加密标准。这个标准用来替代原先的DES,2006年,已然成为对称密钥加密中最流行的算法之中的一个。

    import java.security.SecureRandom;

    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;

    public class EncryptTool {
    public static String encrypt(String seed, String clearText) throws Exception {
            byte[] rawkey = getRawKey(seed.getBytes());
            byte[] result = encrypt(rawkey, clearText.getBytes());
            return toHex(result);

        }

        public static String decrypt(String seed, String encrypted) throws Exception {
            byte[] rawKey = getRawKey(seed.getBytes());
            byte[] enc = toByte(encrypted);
            byte[] result = decrypt(rawKey, enc);
            return new String(result);
        }

        /**
         * 生成给定的种子字节数
         * @param seed
         * @return
         * @throws Exception
         */
        private static byte[] getRawKey(byte[] seed) throws Exception {
         //KeyGenerator 提供对称密钥生成器的功能。支持各种算法  DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
            sr.setSeed(seed);
            kgen.init(128, sr);
            SecretKey sKey = kgen.generateKey();
            byte[] raw = sKey.getEncoded();
            return raw;
        }

        /**
         * 对字节串clear加密
         * @param raw
         * @param clear
         * @return
         * @throws Exception
         */
        private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
         //SecretKeySpec 负责保存对称密钥
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            //Cipher 负责完毕加密或解密工作
            Cipher cipher = Cipher.getInstance("AES");
            //ENCRYPT_MODE 表示加密
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            byte[] encrypted = cipher.doFinal(clear);
            return encrypted;
        }

        /**
         * 对字节串encrypted解密
         * @param raw
         * @param encrypted
         * @return
         * @throws Exception
         */
        private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            //DECRYPT_MODE 表示解密
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            byte[] decrypted = cipher.doFinal(encrypted);
            return decrypted;
        }

        public static String toHex(String txt) {
            return toHex(txt.getBytes());
        }

        public static String fromHex(String hex) {
            return new String(toByte(hex));
        }

        public static byte[] toByte(String hexString) {
            int len = hexString.length() / 2;
            byte[] result = new byte[len];
            for (int i = 0; i < len; i++)
                result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue();
            return result;
        }

        public static String toHex(byte[] buf) {
            if (buf == null)
                return "";
            StringBuffer result = new StringBuffer(2 * buf.length);
            for (int i = 0; i < buf.length; i++) {
                appendHex(result, buf[i]);
            }
            return result.toString();
        }

        private static void appendHex(StringBuffer sb, byte b) {
            final String HEX = "0123456789ABCDEF";
            sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
        }
    }

    非对称加密

    与对称加密算法不同。非对称加密算法须要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,假设用公开密钥对数据进行加密。仅仅实用相应的私有密钥才干解密;假设用私有密钥对数据进行加密。那么仅仅实用相应的公开密钥才干解密。

    由于加密和解密使用的是两个不同的密钥,所以这样的算法叫作非对称加密算法。

    1.RSA是眼下最有影响力的公钥加密算法。它能够抵抗到眼下为止已知的全部password攻击,已被ISO推荐为公钥数据加密标准。

    RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分easy,但那时想要对其乘积进行因式分解却极其困难。因此能够将乘积公开作为加密密钥。


    2.DSA Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种。被美国NIST作为DSS(DigitalSignature Standard)。

    单向加密

    常见的单向加密:

    BASE64 严格地说,属于编码格式。而非加密算法
    MD5(Message Digest algorithm 5,信息摘要算法)
    SHA(Secure Hash Algorithm,安全散列算法)
    HMAC(Hash Message Authentication Code。散列消息鉴别码)

    Java一般须要获取对象MessageDigest来实现单项加密。



    MD5 即Message-Digest Algorithm 5(信息-摘要算法 5)。MD5的前身有MD2、MD3和MD4。用于确保信息传输完整一致。

    是计算机广泛使用的杂凑算法之中的一个,主流编程语言普遍已有MD5

    实现。MD5就是把一个随意长度的字节串变换成一定长的十六进制数字串。

    import java.security.MessageDigest; 
    import java.security.NoSuchAlgorithmException; 
     
    public class EncrypMD5 { 
         
        public byte[] eccrypt(String info) throws NoSuchAlgorithmException{ 
            //依据MD5算法生成MessageDigest对象 
            MessageDigest md5 = MessageDigest.getInstance("MD5"); 
            byte[] srcBytes = info.getBytes(); 
            //使用srcBytes更新摘要 
            md5.update(srcBytes); 
            //完毕哈希计算,得到result 
            byte[] resultBytes = md5.digest(); 
            return resultBytes; 
        } 
         
         
     

    一般MD5和BASE64一起使用



  • 相关阅读:
    MySQL密码复杂度与密码过期策略介绍
    mysql 5.7安装密码校验插件validate_password
    MySQL安装控制插件(Connection-Control)--可有效的防止客户端暴力登录的风险(攻击)
    Liunx 无法杀掉reids进程解决方法
    Linux安装Kafka
    ZooKeeper安装及简单操作
    关于数组的算法题(一)
    集合框架方法(用于算法)
    Spring简答题(一)
    java选择题(三)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/8410652.html
Copyright © 2020-2023  润新知