精华内容
下载资源
问答
  • Https加密方式

    千次阅读 2018-08-28 11:43:58
    加密方式 两者区别 Https加密的选择 对称加密弊端 非对称加密弊端 Https加密 总结 Https加密 介绍 Http直接通过明文在浏览器和服务器之间传递消息,容易被监听抓取到通信内容。 Https采用对称加密...

    Https加密

    介绍

    Http直接通过明文在浏览器和服务器之间传递消息,容易被监听抓取到通信内容。
    Https采用对称加密和非对称加密结合的方式来进行通信。
    Https不是应用层的新协议,而是Http通信接口用SSL和TLS来加强加密和认证机制。

    加密方式

    • 对称加密:加密和解密都是同一个密匙。
    • 非对称加密:密钥成对出现,分为公钥和私钥,公钥加密需要私钥解密,私钥加密需要公钥解密。

    两者区别

    • 对称加密速度快,非对称加密速度慢。
    • 对称加密要将密钥暴露,和明文传输没区别。
    • 非对称加密将公钥暴露,供客户端加密,服务端使用私钥解密。

    Https加密的选择

    对称加密弊端

    对称加密速度快,适合Https加密算法,但是服务器和浏览器之间传递密钥的过程被人监听,相当明文传输。

    非对称加密弊端

    服务端只将公钥暴露,浏览器使用公钥对消息进行非对称加密,服务端用私钥解密。但是服务端向浏览器回复的时候,只能用私钥进行加密,浏览器只能用公钥解密。但是:公钥是所有人都知道的,所有人都可以读取服务端回复的消息来进行解密,所以解决不了服务端向浏览器传递消息

    Https加密

    对称加密和非对称加密结合方式

    1. 浏览器使用Https的URL访问服务器,建立SSL链接。
    2. 服务器收到SSL链接,发送非对称加密的公钥A返回给浏览器
    3. 浏览器生成随机数,作为对称加密的密钥B
    4. 浏览器使用公钥A,对自己生成的密钥B进行加密,得到密钥C
    5. 浏览器将密钥C,发送给服务器。
    6. 服务器用私钥D对接受的密钥C进行解密,得到对称加密钥B。
    7. 浏览器和服务器之间可以用密钥B作为对称加密密钥进行通信。

    总结

    这样浏览器和服务器就共享一个对称加密密钥B,重要的是不会被拦截到。只在传输密钥B的时候进行了一次非对称加密,之后就用对称加密进行传送数据。

    展开全文
  • 最近在搞License,RSA对其加密后感觉加密后的字符串太长 如果想让其长度固定8位 或16位 怎么做?请各位前辈指导指导,谢谢啦
  • 常见加密方式

    千次阅读 2017-09-30 10:18:46
    对称加密是快速、简单的一种加密方式,加密(encryption)与解密(decryption)的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。 对称加密...

    对称加密

    对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。

    对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

    对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

    优点:算法公开、计算量小、加密速度快、加密效率高、可逆

    缺点:双方使用相同钥匙,安全性得不到保证

    现状:对称加密的速度比公钥加密快很多,在很多场合都需要对称加密,

    算法: 在对称加密算法中常用的算法有:DES(数据加密标准,速度较快,适用于加密大量数据的场合)、3DES、AES(基于排列和置换运算)等。

    非对称加密

    非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。非对称加密的缺点是加解密速度要远远慢于对称加密。不适合进行大量数据的加密操作

    常见的非对称加密算法有:RSA、ECC(椭圆曲线密码编码学)、DSA(数字签名算法,是一种标准的 DSS(数字签名标准))

    ECC与RSA的比较

    ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:

    Ø  抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。

    Ø  计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。

    Ø  存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。

    Ø  带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。

     

    Hash算法(摘要算法)

    Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

    常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA

    MD5和SHA比较

    Ø  对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。

    Ø  对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。

    Ø  速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

    加密算法的选择

    由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

    对称加密算法不能实现签名,因此签名只能非对称算法

    由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

    在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

     

    RSA 签名机制

    1、 组合发送数据

    2、 使用发送数据和商户私钥生成基于 SHA1 的 RSA 数字签并将签名整合到发送数据中

    3、 将签名使用随机生成的aeskey进行aes加密

    4、 将aeskey使用rsa加密

    5、 发送数据

    MD5签名机制:

    在MD5签名时,需要私钥参与签名。

    MD5的私钥是以英文字母和数字组成的32位字符串。商户可提供给由第三方初始化到系统中。数据交互之前进行验签操作

    公钥加密算法RSA

    openssl_pkey_get_private ( mixed $key [, string$passphrase = “” ] ) 此方法用于加载私钥。
    $key接受的参数可以是私钥文件(协议+文件路径)或者私钥的内容。如上面代码里的方式是后者,如果换成第一种方式则是:
    $privatekey = openssl_pkey_get_private(“file://$privatekeyFile”, $passphrase);
    $passphrase参数为私钥的密码,如果私钥没有密码的话,可以不传或者传空。 此外,这个方法还有个别名:openssl_get_privatekey

    openssl_digest ( string $data , string $method [, bool$raw_output = false ] ) 此方法用于对数据进行摘要计算。
    $data是需要生成摘要的数据。
    $method是生成摘要的算法。
    $raw_output表示是否返回原始数据,如果为false(默认)的话则返回binhex编码后的数据。

    事实上摘要的生成可以不使用openssl的这个方法,因为其实生成摘要就是对数据进行hash,我们可以用以下代码取代摘要生成部分: <preclass="brush:php;gutter:true;first-line:1;"> if (function_exists(‘hash’)){ $digest = hash($digestAlgo, $data, TRUE); } elseif (function_exists(‘mhash’)){ $digest =mhash(constant(“MHASH_” . strtoupper($digestAlgo)), $data); }$digest = bin2hex($digest); </pre> 使用hash方法有个好处就是支持的算法要比openssl_digest多很多。具体支持的算法可以调用hash_algos()方法查看。

    openssl_sign ( string $data , string &$signature ,mixed $priv_key_id [, int $signature_alg = OPENSSL_ALGO_SHA1 ] ) 此方法用于对数据进行签名。 $data为需要进行签名的数据,一般为摘要。 $signature为调用成功后生成的签名。 $priv_key_id是openssl_pkey_get_private方法返回的资源标识符。$signature_alg是签名使用的算法,默认为OPENSSL_ALGO_SHA1。支持的算法请参照手册。

    为什么要先生成摘要再签名?因为用私钥签名是比较耗时耗性能的,特别是在数据比较大的情况下。而摘要算法可以很快的生成一串很短的字符串。用这串东西去签名就快很多了。

    生成摘要的算法以及验签的算法必须跟签名时保持一致。

    这里,我们又学习到两个新的方法:

    openssl_pkey_get_public ( mixed $certificate ) 这个方法用于加载公钥。
    $certificate为公钥的内容。 同样,这个方法也有个别名:此外,这个方法还有个别名:openssl_get_publickey

    openssl_verify ( string $data , string $signature ,mixed $pub_key_id [, int $signature_alg = OPENSSL_ALGO_SHA1 ] ) 此方法用于验签。 $data为用于生成签名的数据。 $signature为上一步生成的签名。 $pub_key_id为加载的公钥。 $signature_alg为验签的算法。对应签名的算法。

    openssl_public_encrypt ( string $data , string&$crypted , mixed $key [, int $padding = OPENSSL_PKCS1_PADDING ] ) 此方法用于使用公钥进行加密。
    $data为需要加密的数据。
    $crypted为加密后的数据。
    $key为公钥。
    $padding为填充方式,默认为OPENSSL_PKCS1_PADDING,还可以是如下几个值:OPENSSL_SSLV23_PADDING, OPENSSL_PKCS1_OAEP_PADDING,OPENSSL_NO_PADDING

    openssl_private_decrypt ( string $data , string&$decrypted , mixed $key [, int $padding = OPENSSL_PKCS1_PADDING ] ) 此方法用于使用私钥进行解密。
    $data为需要解密的数据。
    $decrypted为解密后的数据。
    $key为私钥。
    $padding为填充方式。

    目前还没弄清楚各种填充方式的使用场景。

    公钥加密的数据只能用私钥进行解密,而用私钥加密的数据只能用公钥进行解密。上面的代码描述的是前者。而后者对应的方法是:openssl_private_encryptopenssl_public_decrypt。这两个方法跟上面类似,这里不作解释。

    事实上,在HTTPS里,数据的加密和解密并不是直接使用公钥和私钥进行的,而是使用另外一个密钥进行对称加密跟解密。公钥跟私钥是用来加密跟解密这个密钥的。为什么要这样做了,理由跟上面讲到的签名一样,用公钥加密大数据是比较耗时耗性能的。

    php生成签名默认算法:OPENSSL_ALGO_SHA1 验签采用同种方式.对接java的接口时,对方采用md5.可用md5算法来验签

    填充方式:默认为OPENSSL_PKCS1_PADDING,还可以是如下几个值:OPENSSL_SSLV23_PADDING, OPENSSL_PKCS1_OAEP_PADDING, OPENSSL_NO_PADDING。

    三方java公钥转换格式代码:
    function x509ToPem($data) {
        $pem = chunk_split($data, 64, "\n");
        $pem = "-----BEGIN PUBLIC KEY-----\n".$pem."-----END PUBLIC KEY-----\n";
        return $pem;

     

     

    参考自:

    http://blog.csdn.net/u014774781/article/details/48581583

    https://blog.csdn.net/junerun/article/details/88656505

     

     

    展开全文
  • RAS加密方式

    千次阅读 2020-09-04 10:20:52
    私钥加密的内容只能对应的公钥解密,反之公钥加密的内容只能对应的私钥解密。还有一种对称加密算法,其加密秘钥和解密秘钥为同一个秘钥,比如DES。 二. RSA加密过程 假设A 产生了一对秘钥,私钥自己保存,...

    一. RSA加密算法介绍

    RSA又叫非对称加密算法,这类加密算法有一对秘钥,其中一个用来加密一个用来解密。这一对秘钥中你可以选择一个作为私钥(自己保存),另一个作为公钥(对外公开)。用私钥加密的内容只能用对应的公钥解密,反之用公钥加密的内容只能用对应的私钥解密。还有一种对称加密算法,其加密秘钥和解密秘钥为同一个秘钥,比如DES。

    二. RSA加密过程

    假设A 产生了一对秘钥,私钥自己保存,公钥对外公开,且B获得了A的公钥。在A,B通信的过程中:A向B发送信息:A用自己的私钥加密,B只能用A的公钥解密。B向A发送信息:B用A的公钥加密数据,A只能用自己的私钥解密这样就保证了数据的安全传输;但是这中间存在问题,如果B向A发送数据的过程中被C拦截了,且C也有A的公钥,这样C就可以用A的公钥重新加密一份数据发送给A,这样就篡改了B发送给A的数据。为了避免这种情况,就要说到数字签名的作用了。

    三.私钥签名,公钥验签

    因为在数据传输过程中有可能被篡改,因此我们要使用数字签名技术来校验发送人的身份,并且事后发送人不能抵赖。下面是数字签名的过程:用户还是A和B

    1 B向A发送 信息 并且用约定好的摘要算法,把 信息 生成一个摘要,同时B用自己的私钥对这个摘要进行加密,生成的加密摘要就叫B的签名

    2 把该信息和摘要一块发送给A

    3 A收到B发送的信息,把该信息用相同的摘要算法生成一个摘要,然后用B的公钥解密A发送过来的摘要,得到一个明文摘要,对比这个明文摘要和B生成的摘要,如果相同说明该信息是B发送的并且该信息没有被篡改过。

    四.如何生成私钥和公钥

    生成公钥和私钥需要调用jdk_1.8下的rt.jar 的包

    /*
     * 获取私钥
     *
     * @param keyMap 密钥对
     * @return String
     */
    public static String getPrivateKey(Map<String, Object> keyMap) {
       Key key = (Key) keyMap.get(PRIVATE_KEY);
       return Base64.encodeBase64String(key.getEncoded());
    }
    
    /**
     * 获取公钥
     *
     * @param keyMap 密钥对
     * @return String
     */
    public static String getPublicKey(Map<String, Object> keyMap) {
       Key key = (Key) keyMap.get(PUBLIC_KEY);
       return Base64.encodeBase64String(key.getEncoded());
    }
    
    
    
    /**
     * 生成密钥对(公钥和私钥)
     */
    public static Map<String, Object> genKeyPair() throws Exception {
       KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
       keyPairGen.initialize(INITIALIZE_LENGTH);
       KeyPair keyPair = keyPairGen.generateKeyPair();
       RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
       RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
       Map<String, Object> keyMap = new HashMap<>(2);
       keyMap.put(PUBLIC_KEY, publicKey);
       keyMap.put(PRIVATE_KEY, privateKey);
       return keyMap;
    }
    
    public static void main(String[] args) throws Exception {
    
    
    Map<String, Object> keyPair = RSAUtil.genKeyPair();
    //重新生成公钥和对应的私钥
    String publicKey = RSAUtil.getPublicKey(keyPair);
    String privateKey = RSAUtil.getPrivateKey(keyPair);
    System.out.println("publicKey=+>"+publicKey);
    System.out.println("privateKey=+>"+privateKey);
    
    
    }

    五.如何使用私钥进行加密

    1. RSA加密的方式-》将传递过来的参数通过参数的属性作为key,传递的值作为value.放入到TreeMap 中,并把排除掉sign 属性以外的属性以key = value 的方式放入到set中去重。重新提取属性并使用&连接。最后将整体的字符串进行byte[]转换,并加密成base64位的密码。
    2. 使用RSA进行加密需要注意对应参数的顺序。
    /**
     * 校验数字签名
     *
     * @param params    参数集合
     * @param publicKey 公钥(BASE64编码)
     * @param sign      数字签名
     * @return boolean
     */
    public static boolean verify(Map<String, Object> params, String publicKey, String sign) {
       return verify(signData(params).getBytes(), publicKey, sign);
    }
    
    public static String signData(Map<String, Object> params) {
       Map<String, Object> newParams = new TreeMap<>();
       for (Map.Entry<String, Object> entry : params.entrySet()) {
          if ("sign".equals(entry.getKey()) || StringUtil.isNull(entry.getValue())) {
             continue;
          }
          newParams.put(entry.getKey(), entry.getValue());
       }
       List<String> pairs = new ArrayList<>();
       for (Map.Entry<String, Object> entry : newParams.entrySet()) {
          pairs.add(entry.getKey() + "=" + entry.getValue());
       }
    
       String signData = StringUtil.join(pairs.toArray(), "&");
       log.info("signData={}", signData);
       return signData;
    }
    
    /**
     * 校验数字签名
     *
     * @param data      数据
     * @param publicKey 公钥(BASE64编码)
     * @param sign      数字签名
     * @return boolean
     */
    public static boolean verify(byte[] data, String publicKey, String sign) {
       try {
          byte[] keyBytes = Base64.decodeBase64(publicKey);
          X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
          KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
          PublicKey publicK = keyFactory.generatePublic(keySpec);
          Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
          signature.initVerify(publicK);
          signature.update(data);
          return signature.verify(Base64.decodeBase64(sign));
       } catch (Exception e) {
          throw new BusinessException("校验数字签名出错");
       }
    }

    六. 如何使用公钥进行验签

    public static void main(String[] args) throws Exception {
       Map<String, Object> keyPair = RSAUtil.genKeyPair();
    
       Menu menu = new Menu();
       menu.setIcon("1");
       menu.setName("2");
       menu.setPath("3");
       menu.setDescription("4");
    
       //入参
       Map<String, Object> dataMap = BeanUtil.beanToMap(menu);
    
       //私钥加密生成签名
       String sign = RSAUtil.generateRSASign(dataMap, privateKey);
    
       //公钥验签
       boolean checkSign = RSAUtil.verify(dataMap, publicKey, sign);
    
    }

    总结:RSA 加密在实际中的使用场景

    第一种:(甲系统与乙系统双方持有对方的公钥,保留自己的私钥)

    RSA加密生成的公钥和私钥实际上是一对互相可以加密解密的钥匙对,换句话说 你可以用私钥加密,用公钥解密。但是由于一些特定的加密工具为了方便加密传输位数而指定了公钥的秘钥值,私钥是根据公钥的值计算得出的,所以一般私钥比较大且安全性更高,留作自己系统去解密其他系统传来的数据。

    但是我们说道,公钥是可能给复数个其他系统的,你无法得知是哪个系统给你传输的这个数据,所以就有了签名这一说。现在有甲乙两个系统,甲系统要给乙系统传输数据,甲系统的数据使用自己的私钥对传递的信息进行加密,然后加一个签名字段放入要传输的数据中然后整体数据再使用公钥进行加密,传输给乙系统。乙系统拿到数据后,先使用自己的私钥解密数据,然后剔除签名字段,然后解密签名字段看与剔除签名字段的数据进行对比,这一步叫做验签,如果相等则代表此数据时由甲方传来且数据没有被篡改。

    java中也提供了相应的签名方法类Signature可以直接使用,现在假设使用json字符串传输做一次签名验签的案例。

    第二种 实际使用的优化方法

    rsa算法是一种取模计算,当加密位数很大时(比如2048位生成密钥),实际上消耗的计算量还是很大的,而且由于有签名的存在,相当于传了两份数据过去,一正一反加密验签消耗的计算量就非常大了,为了优化加密传输及减少系统计算量,我们一般需要采取一些优化方法:

    1.采取散列算法简化签名

    签名实际上只需要验证数据是否没有被篡改/是否是对方系统发来的数据 实际上是没有必要吧整个数据都进行加密传输,可以使用散列算法来进行压缩验证,常用的有sha256和md5,然后将计算后的值进行签名,接收方使用同样的方法进行压缩验签。

    2.生成随机对称加密密钥,使用对称加密加密数据,然后将密钥进行RSA加密明文传输

    第一种优化虽然优化了签名,减少了数据传输和运算,但是数据本体还是很大,使用rsa加密仍然需要消耗大量的计算能力,于是就有了这种加密方式,生成随机的密钥对称加密数据,然后将对称的密钥进行rsa加密明文传输,对方接受到对称密钥的rsa加密后的字符串,再用私钥解密,得到对称加密的密钥对数据进行解密。

    展开全文
  • SSL 加密方式

    万次阅读 2018-08-23 11:44:36
    加密方式   密码学是涉及数学、电子信息、计算机等多学科的一门重要学科,是现代互联网安全的基石,也是目前如火如荼的区块链技术的安全保障。概括来说,加密方式可归结为不可逆加密与可逆加密。   不可逆加密...

     

    加密方式

     

    密码学是涉及数学、电子信息、计算机等多学科的一门重要学科,是现代互联网安全的基石,也是目前如火如荼的区块链技术的安全保障。概括来说,加密方式可归结为不可逆加密与可逆加密。

     

    不可逆加密

     

    信息摘要(Message Digest)和安全散列(Secure Hash)算法属于此类,常见的算法包括 MD5、SHA1、PBKDF2、bcrypt 等。此类算法可将任意大小的原始数据变换成规定长度的输出,即获取内容的数字指纹,常用于校验原始内容是否被篡改。这类算法的主要特点是:

     

    • 不可逆性。除非穷举等手段,原则上不存在根据密文推断出原文的算法;

    • 雪崩效应。对输入数据敏感,原始内容的极小改动会造成输出的大差异;

    • 防碰撞性。原则上很难找到两组不同的原文,经过加密后密文相同。

     

    左耳朵耗子的“RSYNC 的核心算法”介绍了 MD5 算法在 rsync 中的具体应用。MD5 和 SHA1 已经被证实不安全(王小云教授在04年找到 MD5 迅速碰撞方法,谷歌在17年完成了 SHA1 的第一次碰撞),实践中建议至少用 SHA-256 算法,或采用对算力不敏感的 scrypt、Argon2 等算法。

    哈希算法(安全散列)的一个变种是 HMAC(Hash-based Message Authentication Code)算法,用于解决身份认证和防抵赖。HMAC 算法的输入为一个密钥(通信双方共享)、一种哈希算法(常为经典哈希算法)和原始数据,输出的内容格式取决于所采用的哈希算法。由于只有通信双方知晓密钥,所以可确认信息就是由对方发出。

     

    可逆加密

     

    哈希算法可保证通信中的数据不被篡改,而可逆加密算法是还原出明文的关键。可逆加密算法可分成三类:

     

    • 基于算法的加密算法,也被称为古典加密算法,如 HTTP 认证中的 base64,比特币生成地址用的 base58(公开的算法也可称作编码方式)。这类算法主要对原始内容进行置换和替换得到密文,安全性依赖于算法是否外泄;

    • 对称加密算法,加密和解密使用同一个密钥。对称加密算法的出现标志密码学进入现代密码学阶段,密文的安全性从依赖于算法转向依赖于密钥。常见的对称加密算法有 DES、3DES、AES;

    • 非对称加密算法,加密和解密使用不同的密钥。非对称加密算法开创了密码学的里程碑,解决了对称加密过程中密钥分发的安全问题,被认为现代密码学最伟大的发明。常见的算法有 RSA、DH(Diffie-Hellman)、椭圆曲线算法(Elliptic curve cryptography,ECC)。

     

    非对称算法设计巧妙,但实际中要结合对称加密使用。原因是某些算法不能加解密(DH、DSA),或者效率太低(RSA),或者能处理的数据大小有限制(RSA)。而对称加密算法的有点是速度快、加密强度高。常用非对称算法获得共享密钥,之后用对称加密处理数据。本文的重点是非对称加密及其衍生概念,下面逐一介绍。

     

    公钥、私钥和证书

     

    除算法外,非对称加密中另外两个重要的概念是公钥和私钥。公钥对外公开,任何人均可持有和使用;私钥自行保管,其安全性是通信安危的关键。例如 OpenSSH 客户端默认会拒绝用权限开放的私钥连接服务器。

     

    私钥和公钥的作用一般分为两种:

     

    • 公钥加密,私钥解密,主要用于通信;

    • 私钥加密(签名),公钥解密(验证),主要用于数字签名。

     

    本次做支付对接时,对其算法疑虑的地方是需要用到私钥,按理要用对方的公钥加密才对啊!后来意识到是用作数据签名,用客户端的私钥是正确的。

     

    理论上有了公钥和密钥,双方就可以安全无碍的通信,那常说的证书是怎么回事?

     

    证书,顾名思义,就是证明的文件。例如浏览器和 tlanyan.me 服务器通信,浏览器怎么知道对方就是 tlanyan.me 对应的服务器呢? 在不可信的网络下通信,中立的第三方作用就显现出来了。权威的第三方中立机构( Certificate Authority, CA)收到 tlanyan.me 持有者的证书请求并核验信息后,将持有者的名称、公钥 与 CA 用 私钥生成的数字签名 等信息写成证书颁发给申请者。

     

    用户与服务器通信时,服务器收到请求后将证书发给浏览器,浏览器对证书进行检查(是否过期,能否用 CA 的公钥验证签名等),并向第三方询问是否为真(是否被吊销等),确认无误后,就可以放心地通信了。

     

    证书包含公钥,所以拿到证书意味着就拿到了对方的公钥。几乎所有的浏览器都会对证书进行校验,以确保网页通信中的安全。使用自签发的证书,或者过期、与请求主机不符合的证书,都会导致浏览器发出安全警告,提醒用户潜在的风险,如下图所示:

    CURL 等第三方库一般不会对证书进行检查,那么与服务器交互时如何确保通信的对方是真李逵而非李鬼?

    答案是客户端预先存一份服务器证书(证书从官网、对方邮件等可信渠道获取),通信时校验服务端发来的证书与本地预存的是否一致。如果不一致,则说明遇到了中间人攻击,或预设的通信方实体已经变更,客户端应对这种情况进行处理,例如打印警告或中断通信。

     

    而在校验一致的情形下,客户端用证书的公钥加密信息发往服务端,如果对方是中间人,其没有通信方的私钥就无法解密信息,也会造成通信失败。所以在私钥不泄露的前提下,内置对方证书是解决中间人攻击的最有效办法,因为 CA 也有可能作假(参考 CNNIC),而浏览器需要与成千上万个网站通信,不可能所有站点证书都内置,所以使用 CA 比较合理。之前做微信支付的对接,不理解微信服务器证书的作用,后来才理解其深意。

     

    许多国外网站使用 HTTPS,照样倒在国内伟大的防火墙之下。根据 HTTPS 加密通信的特点,同时 CA 加持,原则上墙是不可能知道通信的内容。那么在 HTTPS 通信时,墙是怎么识别出来并阻断的?个人认为有三个可切入的点:

     

    • DNS 污染,返回错误的 IP 地址;

    • 直接把域名的所有 IP 封掉;

    • 根据 HTTPS 的交互流程,客户端和服务器协商密钥阶段的数据均为明文,获取密钥后才会加密数据(包括 URL)。协商阶段的证书必然出现网站主机名,防火墙在这个阶段可识别并阻断。

     

    总结:通信的私钥应该总是被妥善保管,在不可靠的网络环境下通信,证书能避免中间人攻击。

     

    CSR、PEM、keystore 等

     

    苹果开发会接触到 CSR证书,安卓开发会用到 keystore,web 开发会用到 PEM、密钥、证书、jks 等。这些都是什么?

     

    CSR(Certificate Sign Request)、公钥、密钥和证书归属为一类。CSR 用来获取证书,包含申请人的公钥、邮件等证明身份的信息。证书颁发机构(可以是自己)收到 CSR 后签发证书,生成的证书中包含公钥、有效期、持有人等信息。私钥可单独生成,也可在生成 CSR 的同时生成。整个过程中,私钥应当都要被妥善保管,不能泄露。

     

    keystore、PEM、cer/crt、key 等文件存储格式可归为一类。Java KeyStore(文件后缀 .keystore 或 .jks)是 Java 常用的存储密钥和证书的文件格式,需要设置文件密码、别名和别名密码,安卓打包和部署 Tomcat 时会用到;PEM(Privacy Enhanced Mail)以文本形式存放私钥和证书(链);cer/crt 和 key 分别用来存放证书和密钥;另外一种常见的格式是 pfx 和 p12,同 jks 格式,这类文件一般是二进制,访问需要密码。

     

    PKI(Public key infrastructure)体系构建在公钥加密基础之上,主要解决证书的颁发和管理问题。证书管理中应用广泛的两个标准是 X509 和 PKCS。遵循 X509 标准的证书文件结尾多为 PEM、der、crt 等;遵循 PKCS 标准的证书常用后缀名是 pfx、p12 等。

     

    本次对接晕乎的第二个地方是一处地方读取密钥需要密码,另一处直接读取。根据存储格式可知原因:访问遵循 PKCS#12 标准的 pfx 文件需要密码,遵循 X509 规范的 PEM 文件则可直接查看内容。

     

    OpenSSL

     

    OpenSSL 是通用的加密库,openssl 是基于它的命令行工具,上文提到的内容基本都在其功能范围内。另一个与 openssl 类似的工具是 GPG(GNU Privacy Guard),区别是 OpenSSL 遵循 X509 标准,GPG 遵循 OpenPGP 标准。两者加密的文件在格式上有所差异,无法解开对方加密过的文件。OpenSSL 和 GPG 内置在大多数 *nix 系统中,可直接使用。

     

    以下示例基于 OpenSSL,GPG 的用法可查看文中最后的参考文献。

    接下来看一些简单的 openssl 使用示例:

     

    md5:

    echo tlanyan | openssl md5
    
    ## 结果与下条命令相同
    
    echo tlanyan | md5sum

     

    aes 加解密:

    # 用法
    
    # openssl aes-128-cbc -e -in 加密文件 -out 解密文件 -pass pass:密码
    
    # 例如
    
    echo tlanyan > input
    
    openssl aes-128-cbc -e -in input -out output -pass pass:1234567890abcdef
    
    # 加密的内容在output中
    
    # 解密
    
    openssl aes-128-cbc -d -in output -o origin -pass pa:1234567890abcdef

     

    生成 CSR、签发证书:

    # 先生成csr和私钥
    
    
    
    # 注意使用-nodes选项,否则私钥会有密码,用在nginx启动时需要手动输入
    
    
    
    openssl req -new -out tlanyan.csr -newkey rsa:2048 -nodes -keyout tlanyan.priv.key
    
    
    
    # 接下来的交互里填入一些基本信息,完毕后会生成tlanyan.csr和tlanyan.priv.key两个文件
    
    
    
    # csr的格式如下:
    
    
    
    # -----BEGIN CERTIFICATE REQUEST-----
    
    
    
    # xxxx
    
    
    
    # -----END CERTIFICATE REQUEST-----
    
    
    
    # 密钥文件的格式类似
    
    
    
    # 有了csr,接下来为自己签发证书
    
    
    
    openssl req -x509 -sha256 -nodes -days 365 -in tlanyan.csr -key tlanyan.priv.key -out tlanyan.crt
    
    
    
    # 命令结束后,目录中出现tlanyan.crt的证书文件
    
    
    
    # 校验密钥
    
    
    
    openssl rsa -in tlanyan.priv.key --check
    
    
    
    # 校验csr
    
    
    
    openssl req -in tlanyan.csr -verify
    
    
    
    # 校验证书
    
    
    
    openssl x509 -in tlany.**crt -text -n**ooutPEM

     

    转换各种不同格式的证书:

    # 将pem格式转换成pfx/p12格式
    
    
    
    openssl pkcs12 -export -out tlanyan.pfx -inkey tlanyan.priv.key -in tlaPEMn.crt
    
    
    
    # 将pfx格式转换成pem格式
    
    
    
    openssl pkcs12 -in tlanyan.pfx -out tlanyan.cer -nodes
    
    
    
    # 生成的tlanyan.cer文件包含了证书和公钥,对应导入前的tlanyan.crt和tnPEM . pri v.key两个文件

     

    pem 和 jks 的格式转换太过复杂, 具体请看 Oracle 的文档。

     

    以上演示的只是 openssl 工具包中的极小一部分命令。更多的用法请参考官方文档。

    展开全文
  • hostapd加密方式

    千次阅读 2018-05-24 19:13:30
    hostapd有三种加密方式:WEP、WPA/WPA2、WPA-PSK/WPA2-PSK WEP 比较差的加密方式,已被破解并且不支持80211n。 配置文件中wep加密为: wep_key0=“xxxx” WPA/WPA2 WPA/WPA2是一种比WEP强壮的加密算法,挑选...
  • 账号密码加密方式

    千次阅读 2019-03-10 13:47:21
    加密方式 单独对账号,密码,时间戳进行位移偏量加密 加密后得到三个加密字符串,将这三个字符串&amp;拼接成一个字符串 将拼接得到的字符串Base64加密。得到最终加密字符串用于传输 示例...
  • 一、此版本,修改root... 很多之前语句无效报错。... ... alter user ‘root’@‘localhost’ identified by ‘123456’;...二、修改root用户的加密方式: ...2.通过执行以下命令查看对应用户的加密方式,也可以将user='root...
  • 密码加密的最好方式

    千次阅读 2017-11-06 10:26:10
    密码加密一般不可逆的哈希算法。常用的有md5(不建议,容易被破解)、sha1、sha256、sha512 哈希 长度(bit) 数据库长度(byte) md5 128 16 sha1 160 20 sha256 256 32 sha512 ...
  • SSH连接方式及加密方式

    千次阅读 2018-11-30 10:07:43
    关于对称加密与非对称加密 关于SSH账密连接及密钥连接所使用的不同加密方式 如何不用账密SSH远程连接
  • php中常用的加密方式

    万次阅读 2018-07-17 12:14:08
    要说php中的常用的加密方式,md5可以说是当仁不让。 使用起来也很简单便捷。 注:使用方式请看 六、md5加密方式的漏洞及解决方案   二、password_hash 作为php5.5以上版本专门用于加密的方式,自然有其...
  • 几种加密方式

    千次阅读 2017-05-19 23:38:54
    几种加密方式 1 Base64加密方式(可逆) Base64中的可打印字符包括字母A-Z/a-z/数组0-9/ 加号’+’斜杠’/’ 这样共有62个字符 Base64 ios7之后加入系统库   2 MD5加密 Message Digest Algorithm MD5(中文名为...
  • ssh使用加密方式

    千次阅读 2017-08-06 20:41:41
    ssh实现多机互联采用的加密方式是非对称方式对所要传输的数据进行加密的,其无密码访问过程可通过配置文件完成。非对称加密的方式的具体流程如下: (1)client与sever互联,client发送消息给sever,双方都产生一对...
  • 之前项目中采取的加密方式,只是对于重要的参数进行AES加密,再将各个参数拼接而成,通过MD5签名后形成最后一个参数。目前,改用了RSA签名的方式进行加密。AES加密主要针对于些重要的参数进行加密,如账号、密码等,...
  • Android常用加密方式

    千次阅读 2019-05-16 23:56:10
    加密技术是常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再相同或不同的手段还原(解密)。加密技术包括两个元素:算法和密钥。算法是将普通的信息或者可以理解的信息与一串...
  • 已知原文件与加密后的文件,请问能判断出来加密方式吗?或者能不能判断出来另一对文件 是否同样方式加密的。
  • 上一篇讲到了对称加密,本文主要讲非对称加密。 非对称加密就是指加密解密使用不同的密钥。 经常有人问我公钥私钥到底哪个用来加密哪个用来解密,哪个用来加签,哪个验签。 今天就讲一个比较通俗易懂的方法: ...
  • SS加密方式浅析

    万次阅读 2017-09-24 20:10:53
    注 : 参考资料忘记保存,仅凭记忆简单区别。...速度快 但加密简单,易破解 rc4加密,md5校验 AES 区别 AES-XXX-CFB AES-XXX-CTR AES-XXX-GCM 定义 GMAC伽罗瓦消息验证码+CTR 区别 仅加密
  • 全栈工程师开发手册 (作者...java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥测试代码public static void main(String args[]) { try { RSADemo rsa=new RSADemo(); rsa.generateKey(); byte[] da
  • 软件加密方式

    千次阅读 2007-07-16 10:28:00
    软件加密方式加密一词来源已久,自从人们希望对自己私人的信息得到保护开始,就有了加密这个概念。软件行业的加密是软件厂商为了保护软件开发的利润而采取的一种软件保护方式,加密 的好坏直接影响到软件的销售,从 ...
  • 密码学的几种加密方式

    千次阅读 2019-05-30 12:13:17
    这段时间开始接触区块链技术,区块链中很重要的一个环节就是加密,本文简要介绍一下常用的加密方式 常用的加密方式有这四种,比特币的交易就是基于数字签名加密方式的。 1、对称加密 对称加密是使用同一个密钥对...
  • gitlab默认加密方式

    千次阅读 2019-02-15 18:46:49
    通过salt和cost这两个值来减缓加密过程,ta的加密时间(百ms级)远远超过md5(大概1ms左右); cost值我暂时把ta当作是迭代次数;RoR的devise组件默认的cost是10,但其实推荐的值是12; bcrypt是单向的,而且经过...
  • 加密方式有两种:对称加密 和 非对称加密 对称加密 原理: 加密算法是公开的,靠的是密钥来加密数据,使用一个密钥加密,必须使用相同的密钥才解密。 常用的对称加密算法: DES、3DES、AES 优点: 计算...
  • 摘要:对app加密可以防止应用在运营推广过程中被反编译, ...伪加密是Android4.2.x系统发布前的加密方式之一,通过java代码对APK(压缩文件)进行伪加密,其修改原理是修改连续4位字节标记为”P K 01 02”
  • 通常情况下,我们都需要对密码进行不可逆的加密,然后存放在...目前所使用比较多的是MD5,但是BCrypt也使用的比较多,相对来说BCrypt比MD5要安全一些,他的加密更慢。而且一般我们再对密码进行密文加密后,如果有人从
  • 加密方式之MD5

    千次阅读 2016-10-20 10:05:32
    MD5为计算机安全领域广泛使用的一种散列函数,以提供消息的完整性保护。用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 656,634
精华内容 262,653
关键字:

最实用的加密方式