RSA的前端JS加密后端Java解密

场景

用户登录,用JS将密码进行RSA加密后发送至后端,用Java进行解密判断,最后再使用SHA-256+盐的方式加密入库。
这么做的目的就是防止密码等敏感信息在传输过程中被人截获。

生成密钥对

//bouncy castle(轻量级密码术包)是一种用于 Java 平台的开放源码的轻量级密码术包
Provider provider = new BouncyCastleProvider();
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", provider);
keyPairGen.initialize(1024, new SecureRandom());
KeyPair keyPair = keyPairGen.generateKeyPair();
//打印公钥
System.out.println(keyPair.getPublic());
//打印私钥
System.out.println(keyPair.getPrivate());

运行上面的代码,你会看到输出的密钥对信息

RSA Public Key
            modulus: e93159d1e94f8cc6c5de3e613b793de14b22d29308a31092038884aecade8cfdf61b6feab7cc55446a2ef6ff6495f41d3be2e6a9c4e7272e3d94557488f15869b0192ffc736cdce40524d88f909d9e25b04a682dc69f3de1cb309b21ac2caaee1cbc8adf06085a0e5bd9f1c1d7343210f995d4942c5d71f91cf2553c1a8b2615
    public exponent: 10001

RSA Private CRT Key
            modulus: e93159d1e94f8cc6c5de3e613b793de14b22d29308a31092038884aecade8cfdf61b6feab7cc55446a2ef6ff6495f41d3be2e6a9c4e7272e3d94557488f15869b0192ffc736cdce40524d88f909d9e25b04a682dc69f3de1cb309b21ac2caaee1cbc8adf06085a0e5bd9f1c1d7343210f995d4942c5d71f91cf2553c1a8b2615
    public exponent: 10001
   private exponent: 100292e39e0c97a238088ba8da4ff7272624f46722e32b2a933286c58769232df67d28c069310eb39d44af3196a2d2f944d8cdb45f2fed9937a21d01dcbb113242ce61829abb6a30f71983f92f94967095c30b17810b7c8ce9a7aa0ca71dacfa794199094478ca6f73e480fb4f77d08f010beb80ccdd2aa68d8ef90293256151
             primeP: ffe8981d0e1ae8ba6647d7cb0ab357d06671d77f3ad4ee51bc6a5ea85b47e195096ff7f10b06fa47e0b5c974218560eaf0f1066e25eccd0e83d5b9bb10858dc9
             primeQ: e946add5c446f2eaef162db413cbd5abbab0b7e88afe890111803e55594ba5cef2ebf3013d331b16c51b843a741aa1c3e22fdab5b8b9197428a82ae095f54bed
     primeExponentP: 434395c7fd4f2160ed4570f91384f44df8bf6f8f279d944eb3a199e3d2aa6026d66631db8fb473d0b4c5d37fccd7cc13b4e50575aa4e45cfcce33e8066e553d1
     primeExponentQ: 5532fb4a97e551d37c7f1d322808ca816e2e1cfd51c6a5433ea1182313fa0d1508a4249ccf3d5b2775d616f5427277a29379e6e7781022bbca1da18b6539b201
     crtCoefficient: 64d25a445aa31b32013d058d96b13c39938d079407a58eae91d8282c87ce00fd5ce8b1fd95a07a21b980ec596c2d228de96e1ea19292bd339ea506b08bee2014

其中 private exponent 就是私钥,不能泄露出去。
moduluspublic exponent 要交给前端用于加密。

JS加密

下载js文件
新建一个html文件,并与js文件放在同目录下。
复制下面代码并替换对应的key,就能在控制台看到加密结果。

<html>
<body>
<script src="security.js" type="text/javascript"></script>
<script>
    var key = RSAUtils.getKeyPair('10001', '', 'c6e442535e1dd6968e4ccd7735299278d989cb938a2f97c1081c4e6796895a3063510592e2e90ed427d5a604428ce46391dcb2ba6b5f4a86af1347237d1de489a0dc2f68a1f9a265d1ec350fccd8a76be5004211cee5bf05a083afa17cf335871b141e5c4329f69d1a3546613e0fa7833b7a253c460e5bb0c075dacfccfd6d0d');
    console.log(RSAUtils.encryptedString(key, '123456'));
</script>
</body>
</html>

服务端解密

这里服务端使用的是Java,也可以基于.NET实现。
给出可直接执行的测试代码:

String hexModulus = "c6e442535e1dd6968e4ccd7735299278d989cb938a2f97c1081c4e6796895a3063510592e2e90ed427d5a604428ce46391dcb2ba6b5f4a86af1347237d1de489a0dc2f68a1f9a265d1ec350fccd8a76be5004211cee5bf05a083afa17cf335871b141e5c4329f69d1a3546613e0fa7833b7a253c460e5bb0c075dacfccfd6d0d";
String hexPrivateExponent = "1ce625c15c66146a983d82cd493c95242ae35603ba73b4f810682c838d0f4bbb242d5c2bc9cee12b41bff1108b369885fadaa05f0f68bafeb915445e5cd006645eb816d9a8d89b155aeb8478a60325cf4d7e69c12b3076a4cf31b8c24530e7f13533826bc7e87ddf65b7ccc65951bd7c34238b9f08a1e8a1c2c4dd762c50309";
// 这就是上面html输出的密文
String encryptPassword = "14678fe360b5661f09443d4e377489930aed7c7b29b49223679527bc31bd93dfc575e97f331af79c84b8a76d396e8d8a12c872c800440547b538003b4241cf4078d998644ac444e65d762f6317f71c2b315d891c1980b868dbcad07d211e82fb39f5f2877d849687864be017b5663db6b6f382ab345ef3dce72babb97fe3fbdc";
Provider provider = new BouncyCastleProvider();

KeyFactory keyFac = KeyFactory.getInstance("RSA", provider);
RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(hexModulus, 16), new BigInteger(hexPrivateExponent, 16));
// 生成用于解密的私钥
RSAPrivateKey pk = (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);
// 解密
Cipher cipher = Cipher.getInstance("RSA", provider);
cipher.init(2, pk);
byte[] rawPasswordByte = cipher.doFinal(Hex.decodeHex(encryptPassword.toCharArray()));
System.out.println(StringUtils.reverse(new String(rawPasswordByte)));
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,154评论 5 464
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,252评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,107评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,985评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,905评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,256评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,978评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,611评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,891评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,910评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,736评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,516评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,995评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,132评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,447评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,034评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,242评论 2 339

推荐阅读更多精彩内容

  • 为了防止我们的数据泄露,我们往往会对数据进行加密,特别是敏感数据,我们要求的安全性更高。下面将介绍几种常用的加密算...
    Chauncey_Chen阅读 2,889评论 0 20
  • 由于计算机软件的非法复制,通信的泄密、数据安全受到威胁,解密及盗版问题日益严重,甚至引发国际争端,所以在信息安全技...
    慕涵盛华阅读 2,513评论 0 4
  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    苹果粉阅读 11,416评论 5 29
  • 在开发应用过程中,客户端与服务端经常需要进行数据传输,涉及到重要隐私安全信息时,开发者自然会想到对其进行加密,即使...
    闲庭阅读 3,254评论 0 11
  • 祝愿所有的同学中秋节快乐,阖家幸福[愉快]
    为佳人zhang阅读 193评论 0 3