【前端RSA加密】

55 阅读2分钟

RSA加密算法

维基百科: RSA加密算法是一种非对称加密算法 对极大整数做因数分解的难度决定了 RSA 算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA 算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的 RSA 钥匙才可能被强力方式破解。到2020年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被破解的。

在这里插入图片描述

npm三方库

github.com/travist/jse…

当浏览互联网寻找 RSA Javascript 加密的良好解决方案时,有一大堆库基本上采用了 Tom Wu @ www-cs-students.stanford.edu/~tjw/jsbn 所做的出色工作/ 然后修改该代码以执行他们想要的操作。

demo

采用2048位生成的公钥

import JSEncrypt from 'jsencrypt';
  const encryptor = new JSEncrypt();
    const pubKey = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArBYpsjeeE7RG8XBsCbxf
Ra38w/ktBkqQvwDdkYCNt4M6w24AiEgIKRHeKti4abEf+xRESWmKADkaeiX2lX4D
1R2TiTtFAEpOsubfcndJD1hEYYM9MBjya9nS+6OtZV40R3emevXUbjyQsmCWN2Pc
M3dPvawRDgRj+BEtTHSY7VORhDTcvWfKWgvkc98IGxPVbCB2XEwwBBfRSUapl/pp
lhkefnfPZutv+SOXbGFYdImAeJozQYfVeMBdHlTvJP7nFvowCuM5YkCLq7X8L6cX
1FiaoEzM7oXia3tkrtUnCH4ar1tHjQbZnXn4m63gtEKnEgFsKo1IWDdAK4dXCMO/
8wIDAQAB
-----END PUBLIC KEY-----';
    encryptor.setPublicKey(pubKey);
    const enPassword = encryptor.encrypt(password)

至此,前端密码加密几句完成了,因为如果是登陆场景,前端只需要进行加密就可以了;解密校验由后端完成

扩展前端解密

因为有些场景需要解密,结合文档demo如下:(采用2048位)

const decrypt = new JSEncrypt()//创建解密对象实例
  //之前ssl生成的秘钥
const priKey  = '-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCsFimyN54TtEbx
cGwJvF9FrfzD+S0GSpC/AN2RgI23gzrDbgCISAgpEd4q2LhpsR/7FERJaYoAORp6
JfaVfgPVHZOJO0UASk6y5t9yd0kPWERhgz0wGPJr2dL7o61lXjRHd6Z69dRuPJCy
YJY3Y9wzd0+9rBEOBGP4ES1MdJjtU5GENNy9Z8paC+Rz3wgbE9VsIHZcTDAEF9FJ
RqmX+mmWGR5+d89m62/5I5dsYVh0iYB4mjNBh9V4wF0eVO8k/ucW+jAK4zliQIur
tfwvpxfUWJqgTMzuheJre2Su1ScIfhqvW0eNBtmdefibreC0QqcSAWwqjUhYN0Ar
h1cIw7/zAgMBAAECggEAIJzCoiewKYPMvgzULLQqSgZDFNCwG7Ud4VTEqMJ4GQMh
q8+5AhrEkSP1uqD/segDa43XsyHxKUGpJuTy6jnLeCP2xdcZqIhsibL/Pa4lhmbv
7pr0iZzwtEe/mDjYr5E+zxx5zGuyKoIH2gY78ZtXK9m8nvFw+fsTBvwaXZbrNG6G
Y07mvBM10Pv0Qg1w2H7SDuetAnIIaCJuafzPWgy0iEheW9cZQIMwCiVWXg8DzkCz
s3sJQaKIsTmWpj6a0O8rsu2uE+Ka5lJa7XmUV3jpeIkSCT/TZ28bCzLxduGC9YCc
3GMcitsAHTccQcpXyXU0r/tpkrnJpXzA0sAVFwk7wQKBgQDSKi6XEcArwwVncXA8
a948HFOKu+tSAbUTekS4gir3pi5dPhoaKIKTvyYSVNzw2/5907DYweRBfjxWBqy4
d39+jZtaqbMnCaKK8spCJGY7T0b1iyOU8n8hhKX04EXmvxGP9few0Q0LBKql9Css
2STTYkSI+YccnVo2qqJi5kLlawKBgQDRngRqi7UaF7CNYA7uhRXi5uQsI6ehh89a
3N/yGRtomah+tjx1hQ7mAqO5Sy7zUYuMFKd2bzx4ci7Hh1kKvhx1RdFACN9MSasW
FG1hJMlK+EdD6VfJxGepMRQAN7OSlwQdS6bY0ReCaSvMflDKCdgILmAaDr0ybFLj
wLCvZD+pmQKBgEkWIEOrCaBuXse9fGGWxZ8z3p2lgk1viJAweguMQPMEmKUWfq9Q
HTDSTaQcXQVqDBOn9Z07uGxKQSNNiO1RqUXSaw9ZapMN17fofQwJan//rtafP42B
01JNtgT1pXl8QthEmpGj8Zw+UDYMNqOPFC5qwxi7ZhA+bGwMZRJtrx/nAoGAP9Gd
RJcOZ0hJH3HcefAY7sEfPPUKB1ri3aYbpIjSWHFX5GQ1Wg5Nr+ej0zk5rSjplJeB
OMS7I2yYI3VovaWN4oKEJ7vLyF0xcoJ7nrTleCbJA7saWDqs2M0xarOKv5mszgKH
ZMGcJ78/b34RuMFwfWUpKyXLontqbR7wbCXYYBkCgYAK73A22eTephw8TCFnkjSG
i1pO7jgwv+WxJuAYX01bnNUo9CjD51XslpfS+WNC8AHWqFLJGesBhYjI2yo9D6QK
vKGjlJuJNMpVkU1rC9cAlBBvPY+fO/IfQWiXpQvsSiW8NoKbpTQP15JZjYSY9LvC
SD+EmtReFQlIr3vE87gYnw==
-----END PRIVATE KEY-----'
  decrypt.setPrivateKey(priKey)//设置秘钥
  const uncrypted = decrypt.decrypt(encrypted)//解密之前拿公钥加密的内容