如何使用来自第三方API的加密密钥在golang中进行RSA加密

问题描述

我正在努力实现加密密码,以使用使用加密密码的Ig.com股票交易API。 crypto/***软件包中的所有示例似乎都不符合IG.com的要求。

他们的文档指出需要执行以下步骤

  1. 调用/ session / encryptionKey,其中提供了密钥和时间戳记
  2. 使用密钥创建RSA令牌。
  3. 加密密码+“ |” +时间戳

调用https://demo-api.ig.com/gateway/deal/session/encryptionKey会提供以下类型的响应:(响应的一部分已替换为星号 [*]):

{
    "encryptionKey": "**************iG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo8GLjXQTT96zXJI0Nvhuw8vpGrtB7x0qErBwCXm15x5xnsiZzKyhWy3tyn6Tpe+Yyiaz+gbqBFUChVQ/Plm7ntKepcI68rUnqW1OKFOTP4oZJnu7bs8l0etqeJwIG87pqsnn6CAkWg6BIMBT7QShQj71HBJ8JXiOcm2plc5wXxlO8dD5TN+a3bytf9OMUxZn9ggzauI4RiU0ElybxoeayTbqSrGQkg/D01G3PuDjQa5yf3I5WHSYS+BpylfupsfurbO/ugCmsGVugV5ST7VLK7TReVWxjg20P+/LSJ1gkoVxHIMzmN0I4jk2N2/667nSzmkCZSb4jTyOjdcOlCgWyw******","timeStamp": 1598268011542
}

我尝试的解决方法如下:

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "encoding/base64"
    "fmt"
    "strconv"
)

func main() {
    encryptionKey := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo8GLjXEYY96zXJI0Nvhuw8vpGrtB7x0qErBwCXm15x5xnsiZzKiuWy3tyn6Tpe+Yyiaz+gbqBFUChVQ/Plm7ntKepcI68rUnqW1OKFOTP4oZJnu7bs8l0etqeJwIG87pqsnn6CAkWg6BIMBT7QShQj71HBJ8JXiOcm2plc5wXxlO8dD5TN+a3bytf9OMUxZn9ggzauI4RiU0ElybxoeayTbqSrGQkg/D01G3PuDjQa5yf3I5WHSYS+BpylfupsfurbO/ugCmsGVugV5ST7VLK7TReVWxjg20P+/LSJ1gkoVxHIMzmN0I4jk2N2/667nSzmkSDSb4jTyOjdcOlCgWywIDOITT"
    timestamp := 1598300292178
    rawPassword := "testpassword123"

    encryptedPassword,err := EncryptPassword(encryptionKey,rawPassword,timestamp)

    if err != nil {
        fmt.Errorf("Error occurred,while encrypting the password. Error:",err)
        return
    }

    fmt.Println("Encrypted password:",encryptedPassword)
    fmt.Println("")
}

func EncryptPassword(encryptionKey,rawPassword string,ts int) (string,error) {
    bytes,err := base64.StdEncoding.DecodeString(encryptionKey)

    if err != nil {
        fmt.Println("Error encoding the string to binary array: ",err)
        return "",err
    }

    key,err := x509.ParsePKIXPublicKey(bytes)
    var pubkey *rsa.PublicKey
    pubkey = key.(*rsa.PublicKey)

    if err != nil {
        fmt.Println("Error while generating the key:",err
    }

    var passwd string
    passwd = rawPassword + "|" + strconv.Itoa(ts)

    encrypted_password,err := rsa.EncryptPKCS1v15(rand.Reader,pubkey,[]byte(passwd))

    if err != nil {
        fmt.Println("Error while encrypting the password:",err
    }

    return base64.StdEncoding.EncodeToString(encrypted_password),nil
}

按照指示从/session/encryptionKey的{​​{1}}用加密密钥调用EncryptPassword()。

它返回某种加密的密码,但是对IG.COM API的进一步调用会以 401未经授权

password + "|" + timestamp

JavaScript中的示例实现:https://github.com/wagerfield/ig-api/blob/102d97647a13e921f473d8287fd17f896ce3fdf1/src/utils.js#L29

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...