精华内容
下载资源
问答
  • 本文实例讲述了PHP实现的单向散列加密操作。分享给大家供大家参考,具体如下: 1.加密文件 <?php //sha1_en.php header("content-type:text/html;charset=utf-8"); $str = "我是张三,能给我个人数据吗"; $salt=...
  • 单向散列加密

    2019-10-02 01:17:44
    这时就要用到单向散列加密。  单向散列函数特点  1. 对任意长度的消息散列值是定长的。  2. 散列计算速度快,非常高效。  3. 明文不同,散列加密后的密文一定不同;明文相同,散列加密后密文...

      开发中有一种场景,就是只需要验证正确性而不需要知道它的原文,只需要知道这个值是否存在是否相等就可以了。比如前端登录将用户的密码加密给服务端并存储到数据库。或者验证文件唯一性等。这时就要用到单向散列加密。

      单向散列函数特点

      1. 对任意长度的消息散列值是定长的。

      2. 散列计算速度快,非常高效。

      3. 明文不同,散列加密后的密文一定不同;明文相同,散列加密后密文一定相同。

      4. 具备单向性,无法逆推计算。

      

      单向散列函数也被称为哈希函数,摘要函数或者杂凑函数。其经典算法有 md5 | sha | sha1 | sha256 | sha512 | RSA-SHA等。

     

    【crypto.js验证文件唯一性】

      从百度一张图片,远程下载一张图片到本地并放入工程,命名为123.jpg,这个文件作为本地图片。同时从网页上复制远程这张图片的地址。最终通过散列后的字符串验证本地图片与远程url图片是否为同一张。代码如下:

    let crypto = require('crypto');
    let fs = require('fs');
    let request = require('request');
    
    // 散列算法 'md5','sha','sha1','sha256','sha512','RSA-SHA','RSA-SHA1','RSA-SHA256','RSA-SHA512'
    let algorithm = 'sha256';
    
    // 读取远程图片流
    function dealRemoteUrl(callBack) {
      let imgUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1513790489449&di=6200ee667da844c128e5ef5516a9195d&imgtype=0&src=http%3A%2F%2Fstatic.oschina.net%2Fuploads%2Fimg%2F201312%2F23183439_zFLQ.png"
      let outStream = fs.createWriteStream('./other/output.jpg');
      request(imgUrl).pipe(outStream); // 将图片流输出
    
      let remoteData = '';
      request(imgUrl).on('data', (chunk) => {
        remoteData += chunk;
      });
      request(imgUrl).on('end', (chunk) => {
        let hashDealObj = crypto.createHash(algorithm);
        let remoteHashStr = hashDealObj.update(remoteData).digest('hex');
        callBack(remoteHashStr);
      });
    }
    
    // 读取本地图片流
    function dealLocalImg(callBack) {
      let readerStream = fs.createReadStream('./other/123.jpg');
      let readData = '';
      readerStream.on('data', (chunk) => {
        readData += chunk;
      });
      readerStream.on('end', (chunk) => {
        let hashDealObj = crypto.createHash(algorithm);
        let hashStr = hashDealObj.update(readData).digest('hex');
        callBack(hashStr);
      })
    }
    
    // 对比图片操作
    dealRemoteUrl( (remoteHashStr) => {
      console.log('rHash=', remoteHashStr);
      dealLocalImg( (localHashStr) => {
        console.log('lHash=', localHashStr);
        if (localHashStr == remoteHashStr) {
          console.log("图片一致");
        } else {
          console.log("图片不一致");
        }
      });
    });

     

      执行结果如下

        

      

    转载于:https://www.cnblogs.com/buerjj/p/8035050.html

    展开全文
  • 单向散列加密 是什么? 散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都...

    单向散列加密

    1. 是什么?
      散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。
    2. 适用场景
      单向散列函数一般用于产生消息摘要,密钥加密等.
    3. 常见的加密算法
    • MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。标准密钥长度128位.
    • SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值. 标准密钥长度160位.
    • md4
    • CRC-32
      SHA-1与MD5的比较:
      因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似.
      但还有以下几点不同:
    • 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
    • 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
    • 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。
    1. 特征:雪崩效应、定长输出和不可逆。
    2. 作用:确保数据的完整性。
    3. 加密工具:md5sum、sha1sum和openssl dgst。
    4. 计算某个文件的hash值,例如:md5sum/shalsum FileName, openssl dgst –md5/-sha.
    5. 代码实现(md5)
    import org.apache.commons.codec.binary.Hex;
    import org.apache.commons.lang.StringUtils;
    
    import java.security.MessageDigest;
    import java.util.Random;
    
    /**
     * 加盐MD5加密
     */
    public class PasswordUtil {
        /**
         * 生成含有随机盐的密码
         */
        public static String generate(String password) {
            Random r = new Random();
            StringBuilder sb = new StringBuilder(16);
            sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
    
            String salt = StringUtils.rightPad(sb.toString(), 16, "0");
            password = md5Hex(password + salt);
            char[] cs = new char[48];
            for (int i = 0; i < 48; i += 3) {
                cs[i] = password.charAt(i / 3 * 2);
                char c = salt.charAt(i / 3);
                cs[i + 1] = c;
                cs[i + 2] = password.charAt(i / 3 * 2 + 1);
            }
            return new String(cs);
        }
    
        /**
         * 校验密码是否正确
         */
        public static boolean verify(String password, String md5) {
            char[] cs1 = new char[32];
            char[] cs2 = new char[16];
            for (int i = 0; i < 48; i += 3) {
                cs1[i / 3 * 2] = md5.charAt(i);
                cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
                cs2[i / 3] = md5.charAt(i + 1);
            }
            String salt = new String(cs2);
            return md5Hex(password + salt).equals(new String(cs1));
        }
    
        /**
         * 获取十六进制字符串形式的MD5摘要
         */
        public static String md5Hex(String src) {
            try {
                MessageDigest md5 = MessageDigest.getInstance("MD5");
                byte[] bs = md5.digest(src.getBytes());
                return new String(new Hex().encode(bs));
            } catch (Exception e) {
                return null;
            }
        }
    
        public static void main(String[] args) {
            // 加密+加盐
            String password1 = generate("admin123456789100000");
            System.out.println("结果:" + password1 + "   长度:" + password1.length());
            // 解码
            System.out.println(verify("admin123456789100000", password1));
        }
    }
    

    对称加密

    1. 是什么?
      发件人和收件人使用其共同拥有的单个密钥 ,这种密钥既用于加密,也用于解密,叫做机密密钥(也称为对称密钥或会话密钥)。
      能够提供信息机密性(没有密钥信息不能被解密)、完整性(被改变的信息不能被解密)的服务。
      对称式密码学又称:单钥密码学、秘密密钥密码学、会话密钥密码学、私钥密码学、共享秘钥密码学.
    2. 常见的对称式加密技术
    • DES(数据加密标准):分组式加密,算法源于Lucifer,作为NIST对称式加密标准;64位(有效位56位、校验8位),分组算法.
    • 3DES:128位,分组算法.
    • IDEA(国际数据加密算法):128位,比DES快,分组算法.
    • Blowfish:32-448位,算法公开,分组算法.
    • RC4:流密码,密钥长度可变.
    • RC5:分组密码,密钥长度可变,最大2048位.
    • Rijndael:128位/196位/256位.
    • AES(高级加密标准):DES升级版,算法出自Rinjindael.
    1. 优点
      用户只需记忆一个密钥,就可用于加密、解密;
      与非对称加密方法相比,加密解密的计算量小,速度快,简单易用,适合于对海量数据进行加密处理 。
    2. 缺点
      如果密钥交换不安全,密钥的安全性就会丧失。特别是在电子商务环境下,当客户是未知的、不可信的实体时,如何使客户安全地获得密钥就成为一大难题。
    3. 适用场景
      一般用于服务器与服务器之前的通讯.
    4. 代码实现(基于DES实现加密和解密)
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    import javax.crypto.*;
    import javax.crypto.spec.DESKeySpec;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.security.spec.InvalidKeySpecException;
    
    /**
     * DES加密介绍 DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,
     * 后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,
     * 24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现 。
     * 注意:DES加密和解密过程中,密钥长度都必须是8的倍数
     */
    public class DesUtils {
    
        /**
         * 加密
         *
         * @param datasource
         * @param secretKey
         * @return
         */
        public static String encrypt(byte[] datasource, String secretKey) throws Exception {
            byte[] bytes = operation(datasource, secretKey, Cipher.ENCRYPT_MODE);
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(bytes);
        }
    
        private static byte[] operation(byte[] inputBuffer, String secretKey, int operationMode) throws Exception {
            // DES算法要求有一个可信任的随机数源
            SecureRandom random = new SecureRandom();
            // 创建一个DESKeySpec对象
            DESKeySpec desKey = new DESKeySpec(secretKey.getBytes());
            // 创建一个密匙工厂
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            // 将DESKeySpec对象转换成SecretKey对象
            SecretKey securekey = keyFactory.generateSecret(desKey);
            // Cipher对象实际完成解密操作
            Cipher cipher = Cipher.getInstance("DES");
            // 用密钥初始化Cipher对象
            cipher.init(operationMode, securekey, random);
            // 真正开始解密操作
            return cipher.doFinal(inputBuffer);
        }
    
        /**
         * 解密
         *
         * @param src
         * @param secretKey
         * @return
         * @throws Exception
         */
        public static byte[] decrypt(String src, String secretKey) throws Exception {
            BASE64Decoder decoder = new BASE64Decoder();
            return operation(decoder.decodeBuffer(src), secretKey, Cipher.DECRYPT_MODE);
        }
    
        // 测试
        public static void main(String args[]) throws Exception {
            // 待加密内容
            String str = "abc123&&";
            // 密钥随意定, 长度要是8的倍数
            String password = "12345678";
            String encrypt = encrypt(str.getBytes(), password);
            System.out.println("加密后:" + encrypt);
            // 解密
            byte[] decrypt = decrypt(encrypt, password);
            System.out.println("解密后:" + new String(decrypt, "utf-8"));
        }
    }
    

    非对称加密

    1. 是什么?
      使用一对密钥:一个用于加密信息,另一个则用于解密信息。
      其中加密密钥不同于解密密钥, 公钥加密私钥解密; 反之, 私钥加密公钥解密。
      密钥依据性质划分,将其中的一个向外界公开,称为公钥;另一个则自己保留,称为私钥。公钥(Public key)常用于数据加密(用对方公钥加密)或签名验证(用对方公钥解密),私钥(Private key)常用于数据解密或数字签名。
      具有机密性、完整性和抗抵赖性.
    2. 常用算法
      RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)
    3. 优点: 难破解
    4. 缺点: 加密速度慢
    5. 适用场景
      一般用于客户端与服务器之前的通讯.
    6. 代码实现(RSA 工具类)
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.Cipher;
    import java.security.*;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    
    /**
     * RSA加解密工具类
     */
    @Slf4j
    public class RsaUtils {
    
        // 公钥
        public static String publicKey;
    
        // 私钥
        public static String privateKey;
    
        static {
            generateKey();
        }
    
        /**
         * 生成公钥和私钥
         */
        public static void generateKey() {
            // 1.初始化秘钥
            KeyPairGenerator keyPairGenerator;
            try {
                keyPairGenerator = KeyPairGenerator.getInstance("RSA");
                // 随机数生成器
                SecureRandom sr = new SecureRandom();
                // 设置512位长的秘钥
                keyPairGenerator.initialize(512, sr);
                // 开始创建
                KeyPair keyPair = keyPairGenerator.generateKeyPair();
                RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
                RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
                // 进行转码
                publicKey = Base64.encodeBase64String(rsaPublicKey.getEncoded());
                // 进行转码
                privateKey = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
            } catch (NoSuchAlgorithmException e) {
                log.error("生成公钥和私钥, 错误信息", e);
            }
        }
    
        /**
         * 公钥匙加密(或解密)
         *
         * @param content
         * @param publicKeyStr
         * @param operationMode
         * @return
         */
        public static String encryptByPublicKey(String content, String publicKeyStr, int operationMode) {
            // 公钥要用X509进行处理
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));
            KeyFactory keyFactory;
            PublicKey publicKey;
            Cipher cipher;
            byte[] result;
            String text = null;
            try {
                keyFactory = KeyFactory.getInstance("RSA");
                // 还原Key对象
                publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
                cipher = Cipher.getInstance("RSA");
                cipher.init(operationMode, publicKey);
                // 加密
                if (operationMode == Cipher.ENCRYPT_MODE) {
                    result = cipher.doFinal(content.getBytes());
                    text = Base64.encodeBase64String(result);
                } else if (operationMode == Cipher.DECRYPT_MODE) {
                    // 解密
                    result = cipher.doFinal(Base64.decodeBase64(content));
                    text = new String(result, "UTF-8");
                }
            } catch (Exception e) {
                log.error("公钥匙加密(或解密), 错误信息", e);
            }
            return text;
        }
    
        /**
         * 私钥匙解密(或加密)
         *
         * @param content
         * @param privateKeyStr
         * @param operationMode
         * @return
         */
        public static String decryptByPrivateKey(String content, String privateKeyStr, int operationMode) {
            // 私钥要用PKCS8进行处理
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyStr));
            KeyFactory keyFactory;
            PrivateKey privateKey;
            Cipher cipher;
            byte[] result;
            String text = null;
            try {
                keyFactory = KeyFactory.getInstance("RSA");
                // 还原Key对象
                privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
                cipher = Cipher.getInstance("RSA");
                cipher.init(operationMode, privateKey);
                // 加密
                if (operationMode == Cipher.ENCRYPT_MODE) {
                    result = cipher.doFinal(content.getBytes());
                    text = Base64.encodeBase64String(result);
                } else if (operationMode == Cipher.DECRYPT_MODE) {
                    // 解密
                    result = cipher.doFinal(Base64.decodeBase64(content));
                    text = new String(result, "UTF-8");
                }
            } catch (Exception e) {
                log.error("私钥匙解密(或加密), 错误信息", e);
            }
            return text;
        }
    
        // 测试方法
        public static void main(String[] args) {
            // 注意:公钥加密必须私钥解密, 私钥加密必须公钥解密
            System.out.println("公钥给发送方: " + RsaUtils.publicKey);
            System.out.println("私钥给接收方: " + RsaUtils.privateKey);
    
            // 公钥加密(常用)
            String content = "你吃了吗? O(∩_∩)O~";
            String sendContent = RsaUtils.encryptByPublicKey(content, RsaUtils.publicKey, Cipher.ENCRYPT_MODE);
            System.out.println("内容用公钥加密后:" + sendContent);
    
            // 私钥解密(常用)
            String decryptedContent = RsaUtils.decryptByPrivateKey(sendContent, RsaUtils.privateKey, Cipher.DECRYPT_MODE);
            System.out.println("内容用私钥解密后:" + decryptedContent);
    
            // 私钥加密
            String content2 = "还没, O(∩_∩)O~";
            String sendContent2 = RsaUtils.decryptByPrivateKey(content2, RsaUtils.privateKey, Cipher.ENCRYPT_MODE);
            System.out.println("内容用私钥加密后:" + sendContent2);
    
            // 公钥解密
            String decryptedContent2 = RsaUtils.encryptByPublicKey(sendContent2, RsaUtils.publicKey, Cipher.DECRYPT_MODE);
            System.out.println("内容用公钥解密后:" + decryptedContent2);
        }
    
    }
    

    url转码与解码

    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    
    /**
     * url请求参数需要转码, 避免发生意想不到的结果
     */
    public class UrlUtils {
    
        public static void main(String[] args) throws UnsupportedEncodingException {
            String url = "http://127.0.0.1:8080/tranIndex?";
            // url请求参数转码
            String strParam = "name=" + URLEncoder.encode("1+1", "utf-8");
            String newUrl = url + strParam;
            System.out.println("请求地址: " + newUrl);
        }
    }
    

    小技巧

    1. 重定向适用于请求外部资源, 转发适用于请求本服务的资源.
    2. 抓包工具可以拦截同一网段的请求.
    3. 验签可以检查请求参数是否被篡改, Token也可以防篡改(重定向使用参数令牌来调接口).
    展开全文
  • (1)、对称加密算法 常用的算法包括: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,...

    (1)、对称加密算法

    常用的算法包括:
    DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
    3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
    AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

    1、加密方和解密方使用同一个密钥。
    2、加密解密的速度比较快,适合数据比较长时的使用。
    3、密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦。
    4、加密算法:DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard,支持128、192、256、512位密钥的加密)、Blowfish。
    5、加密工具:openssl、gpg(pgp工具)


    (2)、非对称加密算法

    RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
    DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);
    ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。
    ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:
    抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。
    计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。
    存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。
    带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。

    1、每个用户拥用一对密钥加密:公钥和私钥。
    2、公钥加密,私钥解密;私钥加密,公钥解密。
    3、公钥传输的过程不安全,易被窃取和替换。
    4、由于公钥使用的密钥长度非常长,所以公钥加密速度非常慢,一般不使用其去加密。
    5、某一个用户用其私钥加密,其他用户用其公钥解密,实现数字签名的作用。
    6、公钥加密的另一个作用是实现密钥交换。
    7、加密和签名算法:RSA、ELGamal。
    8、公钥签名算法:DSA。
    9、加密工具:gpg、openssl


    由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。
    对称加密算法不能实现签名,因此签名只能非对称算法。
    由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。
    在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。


    (3)、单向加密(散列算法)

    散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。
    单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:
    1、MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。
    2、SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;
    SHA-1与MD5的比较
    因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
    1、对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
    2、对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
    3、速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

    1、特征:雪崩效应、定长输出和不可逆。
    2、作用是:确保数据的完整性。
    3、加密算法:md5(标准密钥长度128位)、sha1(标准密钥长度160位)、md4、CRC-32
    4、加密工具:md5sum、sha1sum、openssl dgst。
    5、计算某个文件的hash值,例如:md5sum/shalsum FileName,openssl dgst –md5/-sha1


    展开全文
  • 单向散列加密 散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致...

    php加密技术原理浅析(一):单向散列加密

    单向散列加密

    散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。单向散列函数一般用于产生消息摘要,密钥加密等,常见的有: MD5, SHA。

    php加密技术原理浅析(一):单向散列加密

    MD5

    简介 : Message Digest Algorithm MD5(即消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

    特点 :

    • 压缩性: 任意长度的数据,算出的 MD5 值长度都是固定的。

    • 容易计算 : 从原数据计算出 MD5 值很容易。

    • 抗修改性 : 对原数据进行任何改动,哪怕只修改1个字节,所得到的 MD5 值都有很大区别。

    • 强抗碰撞 : 已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难的。

    • 应用 : 一致性验证,数字签名,安全访问认证。

    • 弱点 : 目前已经可以暴力破解 MD5 的值了,即逆推回去。并且从理论上来说 MD5 并不是绝对的唯一,所以在某些极限条件下还是会出现重复的情况的。

    php加密技术原理浅析(一):单向散列加密

    SHA-1

    SHA (Secure Hash Algorithm ,安全散列算法),SHA-1 属于 SHA 中最常见的一种另外其他还有 SHA-256,SHA-384 和 SHA-512。

    特点和应用领域都和 MD5 类似,区别在于 SHA-1 更加安全,但是会慢一些。但是目前 Google 已经宣布可以破解了。。。并且即使是 SHA-256,SHA-384 和 SHA-512 也不能完全保证绝对的安全。

    单向散列加密的 php 代码示例

    /*** md5**/echo 'md5: ' . PHP_EOL;var_dump(md5('password string.')); // 32 bytevar_dump(md5('password string.', TRUE)); // 16 byte (默认是16byte的原始二进制格式,会显示乱码,解决方案如下)var_dump(substr(md5('password string.'), 8, 16)); // 16byte乱码解决方案:32byte时的第8到24位之间的内容和16byte情况下的值是一样的,可以截取下就行/*** sha1**/echo 'sha1: ' . PHP_EOL;var_dump(sha1('password string.')); // 40bytevar_dump(sha1('password string.', TRUE)); // 20byte (默认是16byte的原始二进制格式,会显示乱码,解决方案如下)var_dump(substr(md5('password string.'), 8, 16)); // 20byte乱码解决方案:40byte时的第10到30位之间的内容和20byte情况下的值是一样的,可以截取下就行/*** hash**/echo 'hash: ' . PHP_EOL;var_dump(hash('sha512', 'password string.')); // hash支持多种哈希算法,这里演示‘sha512’方式。512bit,即128bytevar_dump(hash('sha512', 'password string.', TRUE)); // 还支持第三个参数用于输出截取后的原始二进制值,不同算法长度不同/*** crypt**/echo 'crypt: ' . PHP_EOL;var_dump(crypt('password string.')); // 默认创建出来的是弱密码,即没有加盐则会有不同的算法自动提供,php5.6及之后的版本会报个提示var_dump(crypt('password string.', '$1$rasmusle$')); // 加的盐值也应该设置一定的复杂度,并且由于不同系统使用的算法不一致所以可能会导致得到的结果也不一致,可以用默认的crypt来生成盐值var_dump(hash_equals(crypt('password string.'), crypt('password string.', crypt('password string.'))));// 这里用默认的crypt来生成盐值,这样就避免了不同算法的问题// hash_equals比较两个字符串,无论它们是否相等,本函数的时间消耗是恒定的。这里就可以专门用来crypt函数的时序攻击// 这里再科普一下时序攻击:一句话就是通常比较密码时计算机从头开始按位逐次比较遇见不同就返回false,因为计算速度是一定的,// 那么等于说可以根据这个计算时间来推断大概多少位的时候开始不一样了,这样就大大降低了破译密码的难度了/*** password_hash**/echo 'password_hash: ' . PHP_EOL;var_dump(password_hash('password string.', PASSWORD_DEFAULT));// password_hash是crypt的一个简单封装,并且完全与现有的密码哈希兼容,所以推荐使用// 第二个参数指明用什么算法,目前支持:PASSWORD_DEFAULT和PASSWORD_BCRYPT,通常使用前者,目前是60个字符,但是以后可能会增加,所以数据库可以设置成255个字符比较稳妥,后者生成长度为60的兼容使用 "$2y$" 的crypt的字符串// 第三个参数是加盐,php7之后已经废除了,因为默认会给出一个高强度的盐值var_dump(password_verify('password string.', password_hash('password string.', PASSWORD_DEFAULT))); // password_verify是专门用来比较用password_hash生成的密码的,可以防止时序攻击,可以参考hash_equals之于crypt

    php加密技术原理浅析(一):单向散列加密


    展开全文
  • 现代信息安全加密技术主要有三种:单向散列加密技术、对称加密技术、非对称加密技术。 单向散列加密技术 单向散列加密技术是指,通过对不定长输入的信息进行散列计算,得到固定长度的输出,这个散列技术是单向的...
  • 信息加密: ...通常,为了保护网站敏感数据,应用需要对信息进行加密处理,信息加密技术科分为三类:单向散列加密,对称散列加密,非对称散列加密 1. 单向散列加密: 指的是通过对不同输入长度的...
  • 1. 简介 散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始...单向散列函数一般用于产生消息摘要,密钥加密等,常见...
  • 这次给大家带来PHP单向散列加密功能的实现,PHP单向散列加密功能实现的注意事项有哪些,下面就是实战案例,一起来看一下。本文实例讲述了PHP实现的单向散列加密操作。分享给大家供大家参考,具体如下:1.加密文件...
  • 单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:1、MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列...单向散列加密的过程和结果都是单向的,不可逆。 MD5 比较容易破解,需...
  • MD5~单向散列加密

    千次阅读 2016-12-05 17:52:53
    MD5算法具有以下特点: 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。 2、容易计算:从原数据计算出MD5值很容易。 3、抗修改性:对原数据进行任何改动,哪怕只修改1... 单向散列加密是通过对不同输入长
  • php 单向散列加密

    千次阅读 2016-12-01 13:17:18
    1.加密文件 [php] view plain copy //sha1_en.php header("content-type:text/html;charset=utf-8"); $str = "我是张三,能给我个人数据吗"; $salt="123456";//我是唯一不变的salt $sha1=sha1...
  • 单向散列函数

    千次阅读 2020-10-28 16:13:53
    文章目录(一)介绍(二)单向散列函数的性质(三)碰撞性(四)相关术语(五)单向散列函数的应用(六)单向散列函数的具体例子(七)单向散列函数无法解决的问题 (一)介绍 单向散列函数,就是一种采集文件指纹的...
  • 针对等级角色的权限管理和访问控制,形式化地定义与分析了等级密钥管理问题,提出了一个基于单向散列函数的实用的等级密钥管理方案。该方案允许各等级角色自主选择主密钥,并利用安全的单向散列函数和公开的辅助参数...
  • 一文搞懂单向散列函数

    千次阅读 2021-09-27 09:50:28
    单向散列函数(one-way hash function)是指对不同的输入值,通过单向散列函数进行计算,得到固定长度的输出值。这个输入值称为消息(message),输出值称为散列值(hash value)。 单向散列函数也被称为消息摘要...
  • 单向散列函数 (Hash)

    2021-01-10 15:48:39
    单向散列函数1.1 什么是单向散列函数1.2 术语1.3 单向散列函数的特性1.4 单向散列函数的实际应用1.4.1 检测软件是否被篡改1.4.2 消息认证码1.4.3 数字签名1.4.4 伪随机生成器1.4.5 一次性口令1.5 常用的单向散列...
  • 想要了解iOS的签名机制,需要先对加密解密有个简单的了解,再是单向散列函数,然后是数字签名,再是证书,最后就是iOS签名机制了 加密解密 加密主要分为: 1.对称加密加密用的密钥和解密用的密钥是相同的 2.非对称...
  • 单向散列函数算法

    千次阅读 2020-01-01 16:33:46
    单向散列函数算法也称Hash(哈希)算法,是一种将任意长度的消息压缩到某一固定长度(消息摘要的)的函数(该过程不可逆)。 特性: 根据任意长度的信息计算固定长度的散列值; 具备单向性(通过散列值不能反...
  • 认证篇——单向散列函数

    千次阅读 2019-01-14 17:17:04
    一、单向散列函数简介 单向散列函数的性质: 二、单向散列函数的应用: 三、单向散列函数种类: 1)MD4、MD5 2)SHA(安全散列算法) 3)RIPEMD-160 单向散列函数SHA-1介绍(可忽略): 四、对单向散列函数...
  • 单向散列函数的实际应用

    千次阅读 2018-09-22 17:34:35
    一 单向散列函数相关术语 单向散列函数也称为消息摘要函数、哈希函数或者杂凑函数。 输入单向散列函数的消息也称为原像。 单向散列函数输出的散列值也称为消息摘要或者指纹。 完整性也称为一致性。 二 单向...
  • 一提到加密,就会联想到数字签名,这两个经常被混淆的概念到底是什么呢? 加密加密是一种以密码方式发送信息的方法。只有拥有正确密钥的人才能解开这个信息的密码。对于其他人来说,这个信息看起来就像是一系列...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,358
精华内容 4,543
关键字:

单向散列加密