数据安全与加密

当前,我们被计算机包围,网络无处不在。我们依赖网络,但网络本身却是不安全的。特别是我们的数据,如 果解决数据安全是我们面临的一个很大的问题。

安全领域离不开密码学的支持。例如,在OSI安全体系结构中通过数据加密确保数据的保密性,在TCP/IP安全 体系结构中以加密算法为基础构建的SSL/TLS协议。

密码学在加密算法上大体可以分为单向加密算法、对象加密算法、非对称加密算法三大类。MD5、SHA算法是 单向加密算法的代表,单向加密算法是数据完整性校验的常用算法。常见的对象加密算法的代表是DES,对称 加密算法是数据存储的常用算法。RSA算法是典型的非对称加密算法的代表,非对称加密算法是数据传输加密 的常用算法。对称加密算法也可以作为数据传输加密,但非对象加密算法在密钥管理方面更有优势。相对对称 算法而言,非对象加密算法在安全级别上更高。但非对称加密算法在时间效率上不如对称加密算法。

下面简单介绍一些常用加密算法与基础

BASE64

BASE64是一种基于64个字符的编码算法,根据RFC2045的定义:"Base6内容传送编码是一种以任意8位字节序 列组合的描述形式,这种形式不易被人直接识别"。经过编码后的数据会比原始数据略长,并且编码后的字符 串的字符数是以4位单位的整数倍。

Base64算法有编码和解码操作可以充当加密和解密操作,但Base64算法并不能叫做加密算法。因为其算法公 开并且充当密钥的字符映射表也公开。而且Base64算法的加密强度不够高。 下面是Base64编解码在java中的 简单用法实例:

 /***
     * BASE64编码
     * @param data 待编码的数据
     * @return     编码后的数据
     */
    public static String getBase64Encoder(String data){
        byte[] b = Base64.encode(data.getBytes(), Base64.DEFAULT); return new String(b);
    }
    /**
     * Base64解码
     * @param data 待解码的数据
     * @return 解码后的数据
     */
    public static String decodeBase64(String data){
        byte[] b = Base64.decode(data.getBytes(), Base64.DEFAULT); return new String(b);
    }



消息摘要算法


通常情况下在网上下载文件时,可能遇到下载到破损文件的情况,甚者可能下载到被篡改后的文件。如何来验 证下载到的文件和官方提供的文件是否一致?这里就涉及到消息摘要算法。

消息摘要算法又称为散列算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不可 以通过该散列值反推其原始信息,这是消息摘要算法的安全性的根本所在。

消息摘要算法主要分为三大类:MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列 算法)和MAC(Message Authentication Code,消息认证算法)。

常见的MD5、SHA、和HMAC都属于消息摘要算法,它们是三大消息摘要算法的主要代表。MD系列包括MD2、 MD4、和MD5共3种算法;SHA算法主要包括其代表算法SHA-1和SHA-1算法的变种SHA-2系列算法(包括SHA- 224、SHA-256、SHA-384和、SHA-512);MAC算法综合楼上述两种算法,主要包括HmacMD5, HmacSHA1、HmacSHA256、HmacSHA384和HmacSHA512算法。

MD5


MD5算法是典型的消息摘要算法,其前身有MD2,MD3和,MD4算法。不论哪种MD算法,它们都需要获得以讹随 机长度的信息并产生以一个128位的信息摘要。如果将这个128位的信息摘要转换为十六进制,就可以得到一 个32位的字符串,因此我们见到的大部分MD5算法的指纹都是32位十六进制的字符串。

下面是在java中生成数据MD5消息摘要的实现:
/**
 * 获得数据的MD5编码
 *
 * @param data 待处理的数据
 * @return 加密后的MD5值
 */
public static byte[] getMD5(byte[] data) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        return md.digest(data);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return null;
}

消息摘要的主要特点是对同一段数据做多次摘要处理后,其摘要值完全一致。

SHA算法


SHA算法基于MD4算法基础之上,作为MD算法的继任者。SHA与MD算法不同之处在于摘要长度,SHA算法的 摘要长度更长,安全性更高。

下面是在JAVA中产生SHA消息摘要算法的简单示例:

/**
     * SHA-1消息摘要
     *
     * @param data 待处理的数据
     * @return 消息摘要
     * @throws NoSuchAlgorithmException
     */
    public static byte[] encodeSHA(byte[] data) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA");
        return md.digest(data);
    }

    /**
     * SHA-256消息摘要
     *
     * @param data 待处理的数据
     * @return 消息摘要
     * @throws NoSuchAlgorithmException
     */
    public static byte[] encodeSHA256(byte[] data) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        return md.digest(data);
    }

    /**
     * SHA-384消息摘要
     *
     * @param data 待处理的数据
     * @return 消息摘要
     * @throws NoSuchAlgorithmException
     */
    public static byte[] encodeSHA384(byte[] data) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-384");
        return md.digest(data);
    }

    /**
     * SHA-512消息摘要
     * @param data 待处理的数据
     * @return 消息摘要
     * @throws NoSuchAlgorithmException */
    public static byte[] encodeSHA512(byte[] data) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-512");
        return md.digest(data);
    }

MAC算法

MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要。



对称加密算法

对称加密算法是当前应用最广泛,使用频率最高的加密算法。 对于大多数的对称加密算法而言,解密算法是加密算法的逆运算。加密密钥和解密密钥相同。对称加密算法密

钥的长度决定了加密算法的安全性。典型的对象加密算法包括DES、AES、RC2、和RC4等。

DES

在对称加密算法中,DES算法最具代表性,堪称典范。很多对称加密算法均源于DES算法的研究而来。

简单的DES算法在消息传递中的步骤为: 1. 消息传递双方约定密钥,由其中一方构建密钥; 2. 密钥构建者将 密钥公布非另一方 3. 消息发送方使用密码加密数据后发给另一方; 4. 接收方接收解密数据,并使用密钥解 密。

下面是一个简单的加密解密实现:

    public final static String ALGORITHM = "DES";
    /**
     * 加密/解密算法 / 工作模式 / 填充方式
     */
    public final static String CIPHER_ALGOTITHM = "DES/ECB/PKCS5Padding";

    /**
     * 生成DES密钥 *
     * @return 密钥的二进制编码
     * @throws NoSuchAlgorithmException
     */
    public static byte[] generateSecretKey() throws NoSuchAlgorithmException {
        //实例化密钥生成器
        KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
        //初始化,设置密钥长度为默认长度
        kg.init(new SecureRandom());
        //生成密钥
        SecretKey key = kg.generateKey();
        //获得密钥的二进制编码
        return key.getEncoded();
    }

    /**
     * 根据密钥数据生成密钥对象
     * @param key 密钥数据
     * @return 密钥对象
     * @throws InvalidKeyException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     */
    public static SecretKey generateSecretKey(byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException {//实例化DES密钥材料

        DESedeKeySpec spec = new DESedeKeySpec(key);
        //获得DES密钥工厂对象
        SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
        return factory.generateSecret(spec);
    }

    /**
     * DES加密
     *
     * @param data //待加密的数据
     * @param key  //加密密钥数据
     * @return //加密后的数据
     * @throws  NoSuchAlgorithmException
     * @throws  InvalidKeyException
     * @throws  InvalidKeySpecException
     * @throws  NoSuchPaddingException
     * @throws  BadPaddingException
     * @throws  IllegalBlockSizeException
     */
    public static byte[] encrypt(byte[] data, byte[] key) throws NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
        //还原密钥
        SecretKey k = generateSecretKey(key);
        //实例化
        Cipher cipher = Cipher.getInstance(CIPHER_ALGOTITHM);
        //初始化,设置为加密模式
        cipher.init(Cipher.ENCRYPT_MODE,k);
        return cipher.doFinal(data);
    }

    /**
     * DES数据解密
     *
     * @param data 待解密的数据
     * @param key  解密用的密钥
     * @return
     * @throws  NoSuchAlgorithmException
     * @throws  InvalidKeyException
     * @throws  InvalidKeySpecException
     * @throws  NoSuchPaddingException
     * @throws  BadPaddingException
     * @throws  IllegalBlockSizeException
     */
    public static byte[] decrypt(byte[] data, byte[] key) throws NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
        //还原密钥
        SecretKey k = generateSecretKey(key);
        //实例化
        Cipher cipher = Cipher.getInstance(CIPHER_ALGOTITHM);
        //初始化,设置为解密模式
        cipher.init(Cipher.DECRYPT_MODE,k);
        return cipher.doFinal(data);
    }
随着计算机技术的发展,DES算法显得越来越不安全。以致衍生出了其他对称加密算法。典型的就是 DESede(三重DES)算法和AES算法。

AES算法由于密钥建立时间短、灵敏性好、内存低等优点,在当前被广泛研究和使用。



非对称加密算法

非对称加密算法与对称加密算法的主要差别在于非对象加密算法用于加密和解密的密钥不相同,一个公开,称 为公钥;一个保密,称为私钥。因此非对称加密算法也称为公钥加密算法。

非对称算法源于DH算法,该算法为非对称加密算法奠定了基础。其构成主要基于数学问题的求解,主要分为 两类:

基于因子分解难题

RSA算法是最为典型的非对称加密算法,也是当前应用范围最为广泛的非对称加密算法,同时也是第一个既能 用于数据加密也能用于数字签名的算法。

基于离散对数难题

EIGamal算法就是基于离散对象难题的非对称加密算法。ECC算法以椭圆曲线理论为基础、创建密钥时可以更 快、更小、并且更有效。

下面是RSA算法的常用方法:

/**
     * 算法名称
     */
    public static final String KEY_ALGORITHM = "RSA";
    /**
     * RSA密钥长度
     * 默认为1024位
     * 密钥长度必须为64的倍数 * 范围在512~65536之间
     */
    private static final int KEY_SIZE = 1024;


    /**
     * RSA解密
     *
     * @param data 待解密的数据
     * @param key  私钥
     * @return 解密后的数据
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     * @throws NoSuchPaddingException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     */
    public static byte[] decrypt(byte[] data, byte[] key) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        //取得私钥
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(key);
        KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
        //生成私钥
        PrivateKey privateKey = factory.generatePrivate(spec);
        //对数据解密
        Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }

    /**
     * RSA加密
     * @param data  待解密的数据
     * @param key   公钥
     * @return      解密后的数据
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     * @throws NoSuchPaddingException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     */
    public static byte[] encrypt(byte[] data, byte[] key) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        //取得私钥
        X509EncodedKeySpec spec = new X509EncodedKeySpec(key);
        KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
        //生成私钥
        PublicKey publicKey = factory.generatePublic(spec);
        //对数据解密
        Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }

    /**
     * 生成密钥对
     *
     * @return 密钥对对象
     * @throws NoSuchAlgorithmException
     */
    public static KeyPair initKey() throws NoSuchAlgorithmException {
        //实例化密钥对生成器
        KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
        //初始化密钥对生成器
        generator.initialize(KEY_SIZE);
        //生成密钥对
        return generator.generateKeyPair();
    }

    /**
     * 获得密钥对中公钥
     * @param pair 密钥对 *
     * @return
     */
    public static RSAPublicKey getRSAPublicKey(KeyPair pair){
        RSAPublicKey key = (RSAPublicKey)pair.getPublic();
        return key;
    }

    /**
     * 获得密钥对中私钥
     * @param pair 密钥对 *
     * @return
     */
    public static RSAPrivateKey getRSAPrivateKey(KeyPair pair){
        RSAPrivateKey key = (RSAPrivateKey)pair.getPrivate();
        return key;
    }

RSA算法遵循"公钥加密,私钥解密"和“私钥加密,公钥解密”的加密和解密原则。



数字签名算法——带密钥的消息摘要算法

数字签名算法可以看做事一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说,数字签

名算法是非对称加密算法和消息摘要算法的结合体。

数字签名算法是公钥基础设施以及许多网络安全机制(SSL/TLS,VPN等)的基础。

数字签名算法包括签名和验证两项操作,遵循“私钥签名,公钥验证”的签名/验证方式,签名时需要使用私钥和 待签名数据,验证时则需要公钥、签名值和待签名数据,其核心算法主要是消息摘要算法。因此我们可以把数 字签名算法近似的看成一种附加了公钥和私钥的消息摘要算法。

数字签名算法在实际使用时,通常是先使用消息摘要算法对原始消息做摘要处理,然后再使用私钥对摘要值做 签名处理。验证签名时,则使用公钥验证消息的摘要值。

数字签名算法主要包括RSA、DSA、和ECDSA共三种算法。其中RSA算法源于整数因子分解问题,DSA和 ECDSA源于离散对数问题。

作为非对称加密算法,RSA算法堪称典型,同样也是数字签名算法中的经典。基于RSA算法密钥,结合消息摘 要算法可形成对应的签名算法。如结合消息摘要算法MD5算法,可形成MD5withRSA算法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值