当前位置: 首页 > news >正文

织梦网站栏目网站开发设计框图

织梦网站栏目,网站开发设计框图,建网站哪家好新闻,如何做攻击类型网站一、过程 1.调用第三方接口前#xff0c;一般需要按规则将参数按key1value1key2value2 阿斯克码排序,sign参数不参与加密 2.将排序并连接好的参数字符串通过我方的私钥证书#xff08;.pem#xff09;进行加密得到加密串#xff0c;当然加密得到的是 []byte 字节流一般需要按规则将参数按key1value1key2value2 阿斯克码排序,sign参数不参与加密 2.将排序并连接好的参数字符串通过我方的私钥证书.pem进行加密得到加密串当然加密得到的是 []byte 字节流需要将字节流转换成base64字符串 3.将加密字符串赋值给sign参数并与其他加密参数一起通过post application/x-www-form-urlencoded 请求第三方接口。 当然第三方与我方对接的时会要求我方提供公约证书给到他们用以拿到我方请求后对我方请求参数进行延签。 4.同理我方请求第三方后会返回数据给到我方以及第三方会请求我们的回调接口那么就需要对第三方返回的参数进行验签而验签同理需要将加密参数提取出来并进行排序需要明白的是此时解签我们需要用到 第三方的公钥 进行验签 5.其中需要注意的是我所了解的目前golang 加密和解密一般都是用的pem证书而大部分第三方提供的证书是 .pfx  .cer ,所以我需要在win上安装openssl工具然后将 .pfx .cer转成 .pem证书 证书转换方式如下 1. 下载Win64OpenSSL-3_1_2.exe 并安装下载https://slproweb.com/products/Win32OpenSSL.html 2. 环境变量 Path 加入 D:\OpenSSL-Win64\bin 3. amd 下命令 openssl version 验证是否安装成功4. 通过命令解析生成 公私钥 uat.pfx openssl pkcs12 -in xxxx.pfx -nodes -out server.pem #生成为原生格式pem 私钥 ******openssl rsa -in server.pem -out server.key #生成为rsa格式私钥文件openssl x509 -in server.pem -out server.crtopenssl pkcs12 -in xxxx.pfx -clcerts -nokeys -out key.certopenssl x509 -inform der -in xxx.cer -out xxx.pem #公钥pem ******* 二、加密和解密要用到的方法供参考 1.参数进行排序并连接成 key1value1key2value2 字符串并将sign参数排除在外 func GetSignStr(maps map[string]string) string {signData : make(map[string]string, 0)for k, v : range maps {if k ! sign {signData[k] v}}var dataParams stringvar keys []stringfor k : range signData {keys append(keys, k)}sort.Strings(keys)for _, k : range keys {dataParams dataParams k signData[k] }ff : dataParams[0 : len(dataParams)-1]return ff } 2.将排序好的参数字符串进行证书私钥加密并将加密串base64转换 // 将排序好的参数进行加密签名并转成base64字符串返回 signData参数字符串 pemPath 私钥路径./aaa/bbb/private.pem func PrivateSha1SignData(signData, pemPath string) (string, error) {h : crypto.Hash.New(crypto.SHA1)h.Write([]byte(signData))hashed : h.Sum(nil)_, private, err : LoadPrivateKey(pemPath)if err ! nil {return , err}signer, err : rsa.SignPKCS1v15(rand.Reader, private, crypto.SHA1, hashed)if err ! nil {fmt.Println(PrivateSha1SignData Error from signing: %s\n, err)return , err}return Base64Encode(signer), nil }// 根据路径加载证书文件 func LoadPrivateKey(pemPath string) (string, *rsa.PrivateKey, error) {key, err : ioutil.ReadFile(pemPath)if err ! nil {return , nil, err}block, _ : pem.Decode(key)if block nil {return , nil, errors.New(pem.Decode err)}p, err : x509.ParsePKCS8PrivateKey(block.Bytes)if err ! nil {return , nil, err} else {pk : p.(*rsa.PrivateKey)return , pk, nil} }// base64 加密 func Base64Encode(data []byte) string {return base64.StdEncoding.EncodeToString(data) }// base64 解密 func Base64Decode(data string) ([]byte, error) {return base64.StdEncoding.DecodeString(data) } 3.将sign和加密参数转成map post方式请求第三方接口而此处需要注意接口返回的参数返回的参数sign值中是带有 和 / 符号的按正常情况 用 url.QueryUnescape(string(body[:]))转换是安全的但奇怪的是本人遇到过用此方法反而字符串中出现了空格所以用string(body[:]就OK了 func PayPost(requrl string, request map[string]string, publicPemPath string) (respData string, err error) {http : TimeoutClient()resp, err : http.Post(requrl, application/x-www-form-urlencoded, strings.NewReader(HttpBuildQuery(request)))if err ! nil {return respData, errors.New(paypost err1: err.Error())}if resp.StatusCode ! 200 {return respData, fmt.Errorf(http request response StatusCode:%v, resp.StatusCode)}defer resp.Body.Close()data, err : ioutil.ReadAll(resp.Body)if err ! nil {return respData, errors.New(paypost err2: err.Error())}dataString : string(data[:])//dataString, err : url.QueryUnescape(string(data[:]))//if err ! nil {// return respData, errors.New(paypost err3: err.Error())//}return respData, err } 4. 对方回调我们方接口接收参数  //获取参数字节码body, err : ioutil.ReadAll(c.Request.Body)info : if err ! nil {//返回错误return}//参数转成字符串dataString, err : url.QueryUnescape(string(body[:]))if err ! nil {//返回错误return} 5.解密 // signStr参数字符kvkv // signature:加密串base64需要转换 // PublicPemPath第三方公约路径 ./aaa/bbb/public.pem // 解密 func YSCallbackVerify(signStr,signature, PublicPemPath string) (bool, error) {hash : crypto.Hash.New(crypto.SHA1)hash.Write([]byte(str))hashed : hash.Sum(nil)var inSign []byteinSign, err : Base64Decode(signature)if err ! nil {return false, errors.New(解析signature失败: err.Error())}publicPem, err : LoadPublicKey(PublicPemPath)if err ! nil {return false, errors.New(获取公钥失败 err.Error())}err rsa.VerifyPKCS1v15(publicPem, crypto.SHA1, hashed, inSign)if err ! nil {return false, errors.New(PublicSha1Verify Error from signing: err.Error())}return true, nil }//加载公约证书 func LoadPublicKey(pemPath string) (*rsa.PublicKey, error) {key, err : ioutil.ReadFile(pemPath)if err ! nil {return nil, errors.New(加载公钥错误1 err.Error())}block, _ : pem.Decode(key)if block nil {return nil, errors.New(加载公钥错误2 err.Error())}certBody, err : x509.ParseCertificate(block.Bytes)if err ! nil {return nil, errors.New(加载公钥错误3 err.Error())}pb : certBody.PublicKey.(*rsa.PublicKey)return pb, nil } 6.说明请求第三方接口一般参数会有两层或更多层那么我们获取到参数而第二层原本是json字符串那么就需要注意我们golang定义的结构体struct各字段就需要跟它对应以免参数书序不对造成解密失败。当然如上方法都是用的map接收参数当中需要将struct转成map 将map转成struct则需要根据需要来灵活转换。
http://www.w-s-a.com/news/2985593/

相关文章:

  • 实时网站推广的最终目的是宁夏建设职业技术学院官方网站
  • 可以申请免费的个人网站吗阿里云建站售前咨询
  • 网站开发怎么人员组织深圳网站开发建设培训
  • 怎样做网站公司的销售wordpress首页静态化生成
  • 网站维护会导致打不开网页吗?知更鸟wordpress中文
  • 哈尔滨做平台网站平台公司做网站还有开发文档吗
  • 国外免费iphone网站市场监督管理局不处理问题怎么办
  • 怎么创网站qq空间怎么做网站
  • 网站建设的行业代码是多少钱江苏专业网站建设
  • 阿里云新增网站北京建机职业技能鉴定中心官网
  • 兰州建设局网站公告长沙在线注册公司
  • 建设网站的总结机关网站内容建设
  • 江苏军民融合网站建设wordpress 关闭网站
  • 网站有哪些元素组成wordpress手机实现打赏功能
  • 石家庄制作网站公司有哪些做违法网站
  • 化妆品公司的网站建设策划书wordpress自动选择添加标签页
  • 有哪些ui的设计网站网址导航大全
  • 深圳网站设计实力乐云seo广州电商小程序开发
  • 站内优化seo设计网站faq需注意
  • 网站icp备案网址社交网站图片展示
  • 做网站采集内容登封郑州网站建设
  • 南阳做网站推广打开有些网站显示建设中
  • 做海报赚钱的网站汕头网站设计电话
  • 网站服务器租用多少钱一年合适seo推广绩效考核指标是什么
  • 简易手机站做网站的公司叫什么问题
  • 网站建设教程书籍免费下载手机网站翻页效果
  • 网站建设成品做网站ps的素材
  • 泰州建设局网站网站和网页的不同
  • 镇江网站建设报价台州网站建设seo
  • 宿迁公司做网站建网站用什么软件好