美文网首页Android开发程序员
记在uniapp中使用jsencrypt的坎坷

记在uniapp中使用jsencrypt的坎坷

作者: 觉子先生 | 来源:发表于2018-12-25 14:10 被阅读2次

    上周的时候在学习使用uniapp的时候,突然说到了加密这个问题,然后就动手开始了解了,先说明,我真的只是一个萌新。
    首先是加密工具的选择,一开始找了好多,但是都不能很好的实现或者不懂,最后确定下来使用jsencrypt这个插件。
    那么在uniapp中怎么进行引用呢?一开始我是想着通过路径的方式进行引用的,就像这样:

    import '../js/jsencrypt.min.js'
    

    然后报错了,控制台显示如下:


    image.png

    当时我就懵了,是调用方式错了吗?我又找了下,说是可以通过npm安装jsencrypt,然后我就使用node通过以下命令安装了它:

    npm init -y
    cnpm i jsencrypt --save
    

    并通过以下方式重新引用:

    import JSEncrypt from 'jsencrypt'
    

    注意:我这个时候npmjsencrypt的版本是3.0.0,其他版本在看完本文之后无效请另寻他法或者通过 cnpm i jsencrypt@3.0.0 --save 命令进行安装。
    接着依然报错了,我表面笑嘻嘻着表示继续看下,心里当时就[bi][bi][bi]了。
    一星期过去了,尝试过各种奇葩的操作,有看到一个rsa.js的让我觉得那是可以用的,不过找不到官方文档,涉及加密的东西也不敢用,或者我坐井观天了,最后昨天同事给我看了篇文章,说是这个插件使用了 window 对象,然后不管是小程序还是app中都没有窗口对象的环境,就导致不能用 window,一用这脚本就会报错,当然里面也提供了方法,以下给出相关代码并提供原文链接(侵删),要注意的是代码插入具体位置根据原文说法在使用严格模式'use strict';下一行插入:

    // 用来替换 navigator
      var navigator2 = {
        appName: 'Netscape',
        userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
      };
      //  用来替换window
      var window2 = {
        ASN1: null,
        Base64: null,
        Hex: null,
        crypto: null,
        href: null
      };
    //然后请将文中出现的window替换成window2,以及将navigator替换成navigator2
    

    原文:codeCoder-微信小程序中使用RSA算法生成秘钥对
    然后页面中引用jsencrypt的方式不变,重新运行下确实不报错了,那么可以下一步了,我并没有自己去生成公钥和密钥,是叫后端提供给我的,然后这里我也遇到了坑,下面继续说。
    说到公钥密钥,它们是这个样子的:

    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
    FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76
    xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4
    gwQco1KRMDSmXSMkDwIDAQAB
    -----END PUBLIC KEY-----
    
    -----BEGIN RSA PRIVATE KEY-----
    MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
    WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
    aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
    AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
    xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
    m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
    8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
    z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
    rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
    V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
    aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
    psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
    uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
    -----END RSA PRIVATE KEY-----
    

    注意:以上公钥密钥可直接使用,是从github中直接拿过来的,点击 传送阵 了解。

    再说下jsencrypt的使用方法:

    var en = new JSEncrypt()
    en.setPublicKey(this.pubkey)
    let encrypted = en.encrypt('觉子先生')
    console.log('en:'+encrypted)
    
    var de = new JSEncrypt()
    de.setPrivateKey(this.privkey)
    var uncrypted = de.decrypt(encrypted)
    console.log('de:'+uncrypted)
    

    注意:以上 this.pubkeythis.privkeydata 种设置的公钥和密钥。

    那么公钥和密钥是怎么引用的呢,毕竟有很多换行还有头部注释代码,那么是否需要去除换行或者去掉头部注释代码呢?就是下面这个:


    image.png

    那么答案是头部注释代码是可以保留的,但是注释代码里面的空格必须完整,还有注释代码的字母也不能更改,要不然会报错或者无法加密解密,其外去除和不去除空格都是允许的,但是不空格的话定义公钥密钥得通过反引号(`,就是常规键盘中Tab键上面的那个键)包裹起来,像这样子:


    image.png
    好了,写到这感觉没啥写了,本文结束。

    相关文章

      网友评论

        本文标题:记在uniapp中使用jsencrypt的坎坷

        本文链接:https://www.haomeiwen.com/subject/rwyckqtx.html