6

前后端交互,密码加密,RSA 实现前端 js 加密,后端 go 解密

 3 years ago
source link: https://studygolang.com/articles/35387
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前后端交互,密码加密,RSA 实现前端 js 加密,后端 go 解密

Grassto · 3天之前 · 177 次点击 · 预计阅读时间 5 分钟 · 大约8小时之前 开始浏览    

RSA 加密算法简介

一种比较常见的非对称加密算法,常用于前后端交互中的密码加密,前端使用公钥加密密码,后端使用私钥进行解密。公钥可对外开放,私钥是存放在服务端,外部正常情况下是拿不到解密私钥的。

以下为百度百科的部分解释: RSA 公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

在公开密钥密码体制中,加密密钥(即公开密钥)PK 是公开信息,而解密密钥(即秘密密钥)SK 是需要保密的。加密算法 E 和解密算法 D 也都是公开的。虽然解密密钥 SK 是由公开密钥 PK 决定的,但却不能根据 PK 计算出 SK

生成公钥,私钥

  1. goEncrypt 直接调用 GetRsaKey 函数即可在本地生成一个私钥文件 private.pem,一个公钥文件 public.pem

     func main() {
         goEncrypt.GetRsaKey()
     }
    
  2. openssl 生成私钥

     openssl genrsa -out rsa_1024_priv.pem 1024
    
     openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem
    

前端 js 使用公钥加密

首先引入主角:jsencrypt.min.js ,文件在 https://github.com/travist/jsencrypt 该仓库的 bin 目录下。

基本用法:

var encrypt = new JSEncrypt();
encrypt.setPublicKey(`-----BEGIN  WUMAN  RSA PUBLIC KEY -----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA29fttcEDUvhGJEhQXEIH
8blptZRF5itec4GtEGtkSr4Wjmsf2o2XKOr6YEbTOeDA/DdnDSbVzK2ZUscqyBxb
KGwI/Bpv9l5K/sh9+Oj2Y8YH53+XkqRSGvmhHqolhb+gcfH+FKG5IflGuiOREs4h
02TVmPAFPTmZjYBeVexJgmPodGPOe36QVnMeOG8tHOFxItkMvJUpilzs85xdHqTT
jWCtk/SjHrp5NGSkHSmionOtrFiksS/gTX0EzrptmAGHTjZV0NX7Nu8Ma45rVdMR
wXrDPbk0yR0iFdBEZ1ceGsNg2VjrZ3LCZi3zO+ieA7sBjHARHai5MuFlh9KJ8+Yk
wwIDAQAB
-----END  WUMAN  RSA PUBLIC KEY -----`);
var encrypted = encrypt.encrypt("test");

encrypted 即为加密后的字符串,是要传给后端的。test 使用公钥加密后为:mFWBdT4Y70ZNEQ7PVIFKwbkefufu52WGXYLrW0Vk1XuajrrEE54dqj4VK2yuGIeMq5bHKAdkDnACB2ABzHLQuobTDpkS0Nj5AlJvwbRDV3pOCB1x0q3aqEooTppeMs8P/WG3YCRDTQPWgZISPsFBQVT1tk77BiImcY4SZM9IL0B4TFUKS9sShnjAebxmJkj8jfYYh7gNzUY0YMvOV6HuiT5C0RsbTe1jwMyN87QEwvpvuPelkeQ8LX1AG+qsn2q4TvOYEKCNfNnePjMIQ/5MlesledwiqUpc/YtY3qj4Qx+8b5luaQ6kyu+zyOXV/A0XjjxIxqLWKU8eAl7eA3o72Q==

后端 go 使用私钥解密

主角:github.com/wumansgy/goEncrypt

注意: JSEncrypt 拿到的是经过 base64 转换后的,所以在这里我们得先将其进行一次 base64 转换。

基本用法:

package main

import (
    "fmt"
    "encoding/base64"
    "github.com/wumansgy/goEncrypt"
)

var privateKey = []byte(`-----BEGIN  WUMAN RSA PRIVATE KEY -----
MIIEpgIBAAKCAQEA29fttcEDUvhGJEhQXEIH8blptZRF5itec4GtEGtkSr4Wjmsf
2o2XKOr6YEbTOeDA/DdnDSbVzK2ZUscqyBxbKGwI/Bpv9l5K/sh9+Oj2Y8YH53+X
kqRSGvmhHqolhb+gcfH+FKG5IflGuiOREs4h02TVmPAFPTmZjYBeVexJgmPodGPO
e36QVnMeOG8tHOFxItkMvJUpilzs85xdHqTTjWCtk/SjHrp5NGSkHSmionOtrFik
sS/gTX0EzrptmAGHTjZV0NX7Nu8Ma45rVdMRwXrDPbk0yR0iFdBEZ1ceGsNg2Vjr
Z3LCZi3zO+ieA7sBjHARHai5MuFlh9KJ8+YkwwIDAQABAoIBAQCyBCtMXbqfWMMT
ZisMSbu9FPJwQlxHgR6+UWceQJe5nisNr9jfVH/udje/9hncaA5dLU+Y6rV9Q6U/
zl7qI2v9U14DJjU7PidkIF1BTQMWz6he4IaQC9cgWLsK5aP0pbL6EYY4lqwewodu
+pXisF/bmW8MpG7ZoOaiGixJT0hG97aS3YD506RqdnK4a9yG5ycoVUZTzFTIM+aq
MCTOWJLbHJBnY52v7Rqaor1jZ0o+C/Cykbts25VHWZ9ygxBfI/S75jTg/zibpqbo
TnICGBqzzfAsThHYiji3ZgEF2bSadxQZ956Rvm5Dlhk0A6ylwKl1gJTAxyZNRjx2
zogLHNFhAoGBAP3TmQSpyYtjr8xdD+AsinMi3q3p/6+FPBh5wrV9Dvd5aSrKCYnU
j/9LOYmCP6JfKc90K3L0PKTfS1LDZXHoeYpzxB0uD2iTIkYQKraUp7rzqLBMkdTB
nTuOByqnTB45WlWlfy6m/8CO+0r5DkrO1fU8gWkg3+bUQoUTPOhuFkqdAoGBAN25
1oVmFyDvxw62WZ95SPktqzmErFH/X+7wpGInUb0vxnGJ0SP2bVgMLyL9Ecz8p5hC
ZEZVbo/WFs17hqz8Z6Xx4Gq7aoredpsZswpApdODs5sQf72LXj4Cuf1iwMGIyQxa
8hElV9uRIeKfEG2E/HBLLPO8qhGBCsWIT1Jms97fAoGBAPQFIf2usTkVXCPvb9zH
VU79PfEanhoCz9SD8mGCWgomqaleVK8yMEFx8120XzLdpBdyCndYQJkMpqBpgzRw
F7C4PNkEuAGEOhX7YuTmox4DM7BR3H0aqetgTpl9/pqr7qGaGlwiZoubqhDYwRnA
IUfDpHIKDdcfRtgit5KIi1utAoGBAKqoAK8IFsEpDGMMgwq1hS8UsXdB4If0MNht
q3hInycoAGsfEjPF1f8w0Y7yjaLiy/PrFdb0pnZa544ch1nZo8Ub2AkOW0CrXUqf
iyhW/ctA0RqGpmszO8QqwRB/07CiIWw7C5maznaWzCfrGe/RraKYme63xYZXdfz3
n2Xi2oqtAoGBAPB2SL1UafzZiC70e+NeDeaCLTCorCvIrN73RngYXU1OKUynrcjL
xOs8yVFs5cK0sNwEkiozcldfOfU2j70tyrGz+txi5+Db6ex5VXmEKSqdZXRDtqqc
KKRFfpuebqdaR50SDa4Lq6JbqYtwg0CLZeju4Mq41i9F2p4myqVDUsZs
-----END  WUMAN RSA PRIVATE KEY -----
`)

func main() {
    ciphertext, err := base64.StdEncoding.DecodeString(`mFWBdT4Y70ZNEQ7PVIFKwbkefufu52WGXYLrW0Vk1XuajrrEE54dqj4VK2yuGIeMq5bHKAdkDnACB2ABzHLQuobTDpkS0Nj5AlJvwbRDV3pOCB1x0q3aqEooTppeMs8P/WG3YCRDTQPWgZISPsFBQVT1tk77BiImcY4SZM9IL0B4TFUKS9sShnjAebxmJkj8jfYYh7gNzUY0YMvOV6HuiT5C0RsbTe1jwMyN87QEwvpvuPelkeQ8LX1AG+qsn2q4TvOYEKCNfNnePjMIQ/5MlesledwiqUpc/YtY3qj4Qx+8b5luaQ6kyu+zyOXV/A0XjjxIxqLWKU8eAl7eA3o72Q==`)
    if err != nil {
        return 
    }

    plaintext, err := goEncrypt.RsaDecrypt(ciphertext, privateKey)
    if err != nil {
        return 
    }
    fmt.Println("明文:", string(plaintext)) // test
}

有疑问加站长微信联系(非本文作者))

280

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077


Recommend

  • 105
    • 掘金 juejin.im 7 years ago
    • Cache

    前后端数据交互

    前端与后台的互动无非是前端需要后台的数据来生成自己需要的页面,前端做出的框架需要后台的数据来填充,在没学习数据库之前,我们把前台上交的数据经过.txt文件来记录,然后需要用的时候,再读取.txt文件,这个方法并非长久之计,接下来学习的数据库就为我们解决...

  • 12

    解密MSSQL链接数据库的密码 wefgod ·

  • 23
    • mawenjian.net 4 years ago
    • Cache

    Jasypt自定义密码加解密算法

    Jasypt自定义密码加解密算法 2020-09-19

  • 10
    • www.happyhong.cn 4 years ago
    • Cache

    唯品会密码JS解密与python登录

    唯品会密码JS解密与python登录 | 从今天开始种树 上班都快一周了,一直想更新,奈何小伙还没有从假期的快乐中缓过来,今天终于耐下心来更新一小篇。抠一下某品会的JS代码,接着使用抠取的JS代码加密密码进行登录。友情提示:为避免不必要的纠...

  • 13

    ShellCode学习2:ShellCode中级版:知道了怎么通过自己写一个完整的ShellCode之后,现在我们就要实现一些在我看来比较高级的操作了,首先,在我学习以来,ShellCode被理解成了栈溢出漏洞利用的锋利武器。 那么,在进行漏洞利用的同时...

  • 5

    在 Linux 上用密码加密和解密文件 | Linux 中国age 是一个简单的、易于使用的工具,允许你用一个密码来加密和解密文件。来源:

  • 14
    • www.iyunying.org 2 years ago
    • Cache

    解密用户行为背后的密码

    行为设计学掌门人斯坦福大学教授BJ Fogg提出的行为模型图: ...

  • 10

    JavaScript前端的AES加密与解密实现 精选 原创 一、CDN插件...

  • 5
    • joker-vip.github.io 1 year ago
    • Cache

    流量解密并挖掘任意密码重置

    流量解密并挖掘任意密码重置先随便找一处功能点在下断点前我先抓个包给你们看看

  • 6
    • fann.im 1 year ago
    • Cache

    Notes on 前端密码加密

    Notes on 前端密码加密 Oct 27, 2023 https://blog.huli.tw/2023/01/10/security-of-encrypt-or-hash-password-in-client-side/ HTTPS must 无...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK