• 加密解密 AES RSA MD5 SHA


     加密解密:

    对称加密:加密和解密相同秘钥。常见算法:AES, XTEA, 3DES。

    非对称加密: 公钥加密 私钥加密。 加密和解密秘钥不同。常见算法:RSA

    OpenSSL> genrsa -out app_private_key.pem   1024  #生成私钥

    OpenSSL> pkcs8 -topk8 -inform PEM -in app_private_key.pem -outform PEM -nocrypt -out app_private_key_pkcs8.pem #Java开发者需要将私钥转换成PKCS8格式
    OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem #生成公钥
    OpenSSL> exit #退出OpenSSL程序

    签名:对字符串求散列值,不可逆。常见算法: MD5(128),SHA1(160),  SHA-224、SHA-256、SHA-384,和SHA-512并称为SHA-2。

    常用于防止篡改。

    SHA2withRsa:

    理解:客户端在数据传输的时候用SHA2对字符签名,然后用公钥对签名值加密。

    服务端接收数据的后,用私钥对加密的签名加密,然后再用和自己签名的字符比对,验证。

    如此做的缘故在于,签名防止篡改,只对签名值加密在于降低RSA的耗时。

    下面是PHP代码示例:

    注意 sign 端用私钥, verify端用公钥。

    如:支付宝对接时,你请求用自己私钥签名,支付宝用你提供的公钥验签

    支付宝回调,你用支付宝公钥验签。

    protected function sign($data, $signType = "RSA") {
    if($this->checkEmpty($this->rsaPrivateKeyFilePath)){
    $priKey=$this->rsaPrivateKey;
    $res = "-----BEGIN RSA PRIVATE KEY----- " .
    wordwrap($priKey, 64, " ", true) .
    " -----END RSA PRIVATE KEY-----";
    }else {
    $priKey = file_get_contents($this->rsaPrivateKeyFilePath);
    $res = openssl_get_privatekey($priKey);
    }

    ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');

    if ("RSA2" == $signType) {
    openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);
    } else {
    openssl_sign($data, $sign, $res);
    }

    if(!$this->checkEmpty($this->rsaPrivateKeyFilePath)){
    openssl_free_key($res);
    }
    $sign = base64_encode($sign);
    return $sign;
    }

    function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') {

    if($this->checkEmpty($this->alipayPublicKey)){

    $pubKey= $this->alipayrsaPublicKey;
    $res = "-----BEGIN PUBLIC KEY----- " .
    wordwrap($pubKey, 64, " ", true) .
    " -----END PUBLIC KEY-----";
    }else {
    //读取公钥文件
    $pubKey = file_get_contents($rsaPublicKeyFilePath);
    //转换为openssl格式密钥
    $res = openssl_get_publickey($pubKey);
    }

    ($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');

    //调用openssl内置方法验签,返回bool值

    if ("RSA2" == $signType) {
    $result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);
    } else {
    $result = (bool)openssl_verify($data, base64_decode($sign), $res);
    }

    if(!$this->checkEmpty($this->alipayPublicKey)) {
    //释放资源
    openssl_free_key($res);
    }

    return $result;
    }

    openssl 命令行生成RSA秘钥对

    https://docs.open.alipay.com/291/106130

    openssl加密:

    https://yq.aliyun.com/ziliao/125560

    加解密工具网站:

    http://tool.chacuo.net/cryptrsapubkey

  • 相关阅读:
    node=day5
    封装异步API
    form表单的name作用
    关于app.use('/static', express.static(path.join(__dirname, 'public')))的理解
    node=day4
    PS切片
    WPF SDK研究 之 数据绑定
    C# WPF DataGrid控件实现三级联动
    wpf中的样式与模板
    WPF : ListBox的几种Template属性
  • 原文地址:https://www.cnblogs.com/swing07/p/7779586.html
Copyright © 2020-2023  润新知