RSA加密算法

  1 import java.io.File;
  2 import java.io.FileInputStream;
  3 import java.io.FileOutputStream;
  4 import java.io.ObjectInputStream;
  5 import java.io.ObjectOutputStream;
  6 import java.math.BigInteger;
  7 import java.security.InvalidParameterException;
  8 import java.security.KeyFactory;
  9 import java.security.KeyPair;
 10 import java.security.KeyPairGenerator;
 11 import java.security.NoSuchAlgorithmException;
 12 import java.security.PrivateKey;
 13 import java.security.Provider;
 14 import java.security.PublicKey;
 15 import java.security.SecureRandom;
 16 import java.security.interfaces.RSAPrivateKey;
 17 import java.security.interfaces.RSAPublicKey;
 18 import java.security.spec.InvalidKeySpecException;
 19 import java.security.spec.RSAPrivateKeySpec;
 20 import java.security.spec.RSAPublicKeySpec;
 21 import java.util.Date;
 22
 23 import javax.crypto.Cipher;
 24
 25 import org.apache.commons.codec.DecoderException;
 26 import org.apache.commons.codec.binary.Hex;
 27 import org.apache.commons.io.FileUtils;
 28 import org.apache.commons.io.IOUtils;
 29 import org.apache.commons.lang.StringUtils;
 30 import org.apache.commons.lang.time.DateFormatUtils;
 31 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 32 import org.slf4j.Logger;
 33 import org.slf4j.LoggerFactory;
 34
 35 /**
 36  * RSA算法加密/解密工具类。
 37  *
 38  */
 39 public abstract class RSAUtils {
 40
 41   /** 算法名称 */
 42   private static final String ALGORITHOM = "RSA";
 43
 44   /** 默认的安全服务提供者 */
 45   private static final Provider DEFAULT_PROVIDER = new BouncyCastleProvider();
 46
 47   /** 密钥大小 */
 48   private static final int KEY_SIZE = 1024;
 49
 50   private static KeyFactory keyFactory = null;
 51
 52   private static KeyPairGenerator keyPairGen = null;
 53
 54   private static final Logger LOGGER = LoggerFactory.getLogger(RSAUtils.class);
 55
 56   /** 缓存的密钥对。 */
 57   private static KeyPair oneKeyPair = null;
 58
 59   /** 保存生成的密钥对的文件名称。 */
 60   private static final String RSA_PAIR_FILENAME = "/_RSA_PAIR.txt";
 61
 62   private static File rsaPairFile = null;
 63
 64   static {
 65     try {
 66       RSAUtils.keyPairGen = KeyPairGenerator.getInstance(RSAUtils.ALGORITHOM,
 67           RSAUtils.DEFAULT_PROVIDER);
 68       RSAUtils.keyFactory = KeyFactory.getInstance(RSAUtils.ALGORITHOM,
 69           RSAUtils.DEFAULT_PROVIDER);
 70     }
 71     catch (NoSuchAlgorithmException ex) {
 72       RSAUtils.LOGGER.error(ex.getMessage());
 73     }
 74     RSAUtils.rsaPairFile = new File(RSAUtils.getRSAPairFilePath());
 75   }
 76
 77   private RSAUtils() {
 78   }
 79
 80   /**
 81    * 使用指定的私钥解密数据。
 82    *
 83    * @param privateKey 给定的私钥。
 84    * @param data 要解密的数据。
 85    * @return 原数据。
 86    */
 87   public static byte[] decrypt(PrivateKey privateKey, byte[] data)
 88       throws Exception {
 89     Cipher ci =
 90         Cipher.getInstance(RSAUtils.ALGORITHOM, RSAUtils.DEFAULT_PROVIDER);
 91     ci.init(Cipher.DECRYPT_MODE, privateKey);
 92     return ci.doFinal(data);
 93   }
 94
 95   /**
 96    * 使用给定的私钥解密给定的字符串。
 97    * <p />
 98    * 若私钥为 {@code null},或者 {@code encrypttext} 为 {@code null}或空字符串则返回
 99    * {@code null}。
100    * 私钥不匹配时,返回 {@code null}。
101    *
102    * @param privateKey 给定的私钥。
103    * @param encrypttext 密文。
104    * @return 原文字符串。
105    */
106   public static String decryptString(PrivateKey privateKey,
107       String encrypttext) {
108     if (privateKey == null || StringUtils.isBlank(encrypttext)) {
109       return null;
110     }
111     try {
112       byte[] en_data = Hex.decodeHex(encrypttext.toCharArray());
113       byte[] data = RSAUtils.decrypt(privateKey, en_data);
114       return new String(data);
115     }
116     catch (Exception ex) {
117       RSAUtils.LOGGER.error(String.format("\"%s\" Decryption failed. Cause: %s",
118           encrypttext, ex.getCause().getMessage()));
119     }
120     return null;
121   }
122
123   /**
124    * 使用默认的私钥解密给定的字符串。
125    * <p />
126    * 若{@code encrypttext} 为 {@code null}或空字符串则返回 {@code null}。
127    * 私钥不匹配时,返回 {@code null}。
128    *
129    * @param encrypttext 密文。
130    * @return 原文字符串。
131    */
132   public static String decryptString(String encrypttext) {
133     if (StringUtils.isBlank(encrypttext)) {
134       return null;
135     }
136     KeyPair keyPair = RSAUtils.getKeyPair();
137     try {
138       byte[] en_data = Hex.decodeHex(encrypttext.toCharArray());
139       byte[] data = RSAUtils.decrypt(keyPair.getPrivate(), en_data);
140       return new String(data);
141     }
142     catch (NullPointerException ex) {
143       RSAUtils.LOGGER.error("keyPair cannot be null.");
144     }
145     catch (Exception ex) {
146       RSAUtils.LOGGER.error(String.format("\"%s\" Decryption failed. Cause: %s",
147           encrypttext, ex.getMessage()));
148     }
149     return null;
150   }
151
152   /**
153    * 使用默认的私钥解密由JS加密(使用此类提供的公钥加密)的字符串。
154    *
155    * @param encrypttext 密文。
156    * @return {@code encrypttext} 的原文字符串。
157    */
158   public static String decryptStringByJs(String encrypttext) {
159     String text = RSAUtils.decryptString(encrypttext);
160     if (text == null) {
161       return null;
162     }
163     return StringUtils.reverse(text);
164   }
165
166   /**
167    * 使用指定的公钥加密数据。
168    *
169    * @param publicKey 给定的公钥。
170    * @param data 要加密的数据。
171    * @return 加密后的数据。
172    */
173   public static byte[] encrypt(PublicKey publicKey, byte[] data)
174       throws Exception {
175     Cipher ci =
176         Cipher.getInstance(RSAUtils.ALGORITHOM, RSAUtils.DEFAULT_PROVIDER);
177     ci.init(Cipher.ENCRYPT_MODE, publicKey);
178     return ci.doFinal(data);
179   }
180
181   /**
182    * 使用给定的公钥加密给定的字符串。
183    * <p />
184    * 若 {@code publicKey} 为 {@code null},或者 {@code plaintext} 为 {@code null} 则返回
185    * {@code
186    * null}。
187    *
188    * @param publicKey 给定的公钥。
189    * @param plaintext 字符串。
190    * @return 给定字符串的密文。
191    */
192   public static String encryptString(PublicKey publicKey, String plaintext) {
193     if (publicKey == null || plaintext == null) {
194       return null;
195     }
196     byte[] data = plaintext.getBytes();
197     try {
198       byte[] en_data = RSAUtils.encrypt(publicKey, data);
199       return new String(Hex.encodeHex(en_data));
200     }
201     catch (Exception ex) {
202       RSAUtils.LOGGER.error(ex.getCause().getMessage());
203     }
204     return null;
205   }
206
207   /**
208    * 使用默认的公钥加密给定的字符串。
209    * <p />
210    * 若{@code plaintext} 为 {@code null} 则返回 {@code null}。
211    *
212    * @param plaintext 字符串。
213    * @return 给定字符串的密文。
214    */
215   public static String encryptString(String plaintext) {
216     if (plaintext == null) {
217       return null;
218     }
219     byte[] data = plaintext.getBytes();
220     KeyPair keyPair = RSAUtils.getKeyPair();
221     try {
222       byte[] en_data = RSAUtils.encrypt(keyPair.getPublic(), data);
223       return new String(Hex.encodeHex(en_data));
224     }
225     catch (NullPointerException ex) {
226       RSAUtils.LOGGER.error("keyPair cannot be null.");
227     }
228     catch (Exception ex) {
229       RSAUtils.LOGGER.error(ex.getCause().getMessage());
230     }
231     return null;
232   }
233
234   /**
235    * 根据给定的系数和专用指数构造一个RSA专用的私钥对象。
236    *
237    * @param modulus 系数。
238    * @param privateExponent 专用指数。
239    * @return RSA专用私钥对象。
240    */
241   public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,
242       byte[] privateExponent) {
243     RSAPrivateKeySpec privateKeySpec = new RSAPrivateKeySpec(
244         new BigInteger(modulus), new BigInteger(privateExponent));
245     try {
246       return (RSAPrivateKey) RSAUtils.keyFactory
247           .generatePrivate(privateKeySpec);
248     }
249     catch (InvalidKeySpecException ex) {
250       RSAUtils.LOGGER.error("RSAPrivateKeySpec is unavailable.", ex);
251     }
252     catch (NullPointerException ex) {
253       RSAUtils.LOGGER.error(
254           "RSAUtils#KEY_FACTORY is null, can not generate KeyFactory instance.",
255           ex);
256     }
257     return null;
258   }
259
260   /**
261    * 根据给定的系数和专用指数构造一个RSA专用的公钥对象。
262    *
263    * @param modulus 系数。
264    * @param publicExponent 专用指数。
265    * @return RSA专用公钥对象。
266    */
267   public static RSAPublicKey generateRSAPublicKey(byte[] modulus,
268       byte[] publicExponent) {
269     RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(
270         new BigInteger(modulus), new BigInteger(publicExponent));
271     try {
272       return (RSAPublicKey) RSAUtils.keyFactory.generatePublic(publicKeySpec);
273     }
274     catch (InvalidKeySpecException ex) {
275       RSAUtils.LOGGER.error("RSAPublicKeySpec is unavailable.", ex);
276     }
277     catch (NullPointerException ex) {
278       RSAUtils.LOGGER.error(
279           "RSAUtils#KEY_FACTORY is null, can not generate KeyFactory instance.",
280           ex);
281     }
282     return null;
283   }
284
285   /** 返回已初始化的默认的私钥。 */
286   public static RSAPrivateKey getDefaultPrivateKey() {
287     KeyPair keyPair = RSAUtils.getKeyPair();
288     if (keyPair != null) {
289       return (RSAPrivateKey) keyPair.getPrivate();
290     }
291     return null;
292   }
293
294   /** 返回已初始化的默认的公钥。 */
295   public static RSAPublicKey getDefaultPublicKey() {
296     KeyPair keyPair = RSAUtils.getKeyPair();
297     if (keyPair != null) {
298       return (RSAPublicKey) keyPair.getPublic();
299     }
300     return null;
301   }
302
303   /**
304    * 返回RSA密钥对。
305    */
306   public static KeyPair getKeyPair() {
307     // 首先判断是否需要重新生成新的密钥对文件
308     if (RSAUtils.isCreateKeyPairFile()) {
309       // 直接强制生成密钥对文件,并存入缓存。
310       return RSAUtils.generateKeyPair();
311     }
312     if (RSAUtils.oneKeyPair != null) {
313       return RSAUtils.oneKeyPair;
314     }
315     return RSAUtils.readKeyPair();
316   }
317
318   public static PublicKeyMap getPublicKeyMap() {
319     PublicKeyMap publicKeyMap = new PublicKeyMap();
320     RSAPublicKey rsaPublicKey = RSAUtils.getDefaultPublicKey();
321     publicKeyMap.setModulus(
322         new String(Hex.encodeHex(rsaPublicKey.getModulus().toByteArray())));
323     publicKeyMap.setExponent(new String(
324         Hex.encodeHex(rsaPublicKey.getPublicExponent().toByteArray())));
325     return publicKeyMap;
326   }
327
328   /**
329    * 根据给定的16进制系数和专用指数字符串构造一个RSA专用的私钥对象。
330    *
331    * @param modulus 系数。
332    * @param privateExponent 专用指数。
333    * @return RSA专用私钥对象。
334    */
335   public static RSAPrivateKey getRSAPrivateKey(String hexModulus,
336       String hexPrivateExponent) {
337     if (StringUtils.isBlank(hexModulus)
338         || StringUtils.isBlank(hexPrivateExponent)) {
339       if (RSAUtils.LOGGER.isDebugEnabled()) {
340         RSAUtils.LOGGER.debug(
341             "hexModulus and hexPrivateExponent cannot be empty. RSAPrivateKey value is null to return.");
342       }
343       return null;
344     }
345     byte[] modulus = null;
346     byte[] privateExponent = null;
347     try {
348       modulus = Hex.decodeHex(hexModulus.toCharArray());
349       privateExponent = Hex.decodeHex(hexPrivateExponent.toCharArray());
350     }
351     catch (DecoderException ex) {
352       RSAUtils.LOGGER.error(
353           "hexModulus or hexPrivateExponent value is invalid. return null(RSAPrivateKey).");
354     }
355     if (modulus != null && privateExponent != null) {
356       return RSAUtils.generateRSAPrivateKey(modulus, privateExponent);
357     }
358     return null;
359   }
360
361   /**
362    * 根据给定的16进制系数和专用指数字符串构造一个RSA专用的公钥对象。
363    *
364    * @param modulus 系数。
365    * @param publicExponent 专用指数。
366    * @return RSA专用公钥对象。
367    */
368   public static RSAPublicKey getRSAPublidKey(String hexModulus,
369       String hexPublicExponent) {
370     if (StringUtils.isBlank(hexModulus)
371         || StringUtils.isBlank(hexPublicExponent)) {
372       if (RSAUtils.LOGGER.isDebugEnabled()) {
373         RSAUtils.LOGGER.debug(
374             "hexModulus and hexPublicExponent cannot be empty. return null(RSAPublicKey).");
375       }
376       return null;
377     }
378     byte[] modulus = null;
379     byte[] publicExponent = null;
380     try {
381       modulus = Hex.decodeHex(hexModulus.toCharArray());
382       publicExponent = Hex.decodeHex(hexPublicExponent.toCharArray());
383     }
384     catch (DecoderException ex) {
385       RSAUtils.LOGGER.error(
386           "hexModulus or hexPublicExponent value is invalid. return null(RSAPublicKey).");
387     }
388     if (modulus != null && publicExponent != null) {
389       return RSAUtils.generateRSAPublicKey(modulus, publicExponent);
390     }
391     return null;
392   }
393
394   /**
395    * 生成并返回RSA密钥对。
396    */
397   private static synchronized KeyPair generateKeyPair() {
398     try {
399       RSAUtils.keyPairGen.initialize(RSAUtils.KEY_SIZE, new SecureRandom(
400           DateFormatUtils.format(new Date(), "yyyyMMdd").getBytes()));
401       RSAUtils.oneKeyPair = RSAUtils.keyPairGen.generateKeyPair();
402       RSAUtils.saveKeyPair(RSAUtils.oneKeyPair);
403       return RSAUtils.oneKeyPair;
404     }
405     catch (InvalidParameterException ex) {
406       RSAUtils.LOGGER.error("KeyPairGenerator does not support a key length of "
407           + RSAUtils.KEY_SIZE + ".", ex);
408     }
409     catch (NullPointerException ex) {
410       RSAUtils.LOGGER.error(
411           "RSAUtils#KEY_PAIR_GEN is null, can not generate KeyPairGenerator instance.",
412           ex);
413     }
414     return null;
415   }
416
417   /**
418    * 返回生成/读取的密钥对文件的路径。
419    */
420   private static String getRSAPairFilePath() {
421     String urlPath = RSAUtils.class.getResource("/").getPath();
422     return new File(urlPath).getParent() + RSAUtils.RSA_PAIR_FILENAME;
423   }
424
425   /**
426    * 若需要创建新的密钥对文件,则返回 {@code true},否则 {@code false}。
427    */
428   private static boolean isCreateKeyPairFile() {
429     // 是否创建新的密钥对文件
430     boolean createNewKeyPair = false;
431     if (!RSAUtils.rsaPairFile.exists() || RSAUtils.rsaPairFile.isDirectory()) {
432       createNewKeyPair = true;
433     }
434     return createNewKeyPair;
435   }
436
437   // 同步读出保存的密钥对
438   private static KeyPair readKeyPair() {
439     FileInputStream fis = null;
440     ObjectInputStream ois = null;
441     try {
442       fis = FileUtils.openInputStream(RSAUtils.rsaPairFile);
443       ois = new ObjectInputStream(fis);
444       RSAUtils.oneKeyPair = (KeyPair) ois.readObject();
445       return RSAUtils.oneKeyPair;
446     }
447     catch (Exception ex) {
448       ex.printStackTrace();
449     }
450     finally {
451       IOUtils.closeQuietly(ois);
452       IOUtils.closeQuietly(fis);
453     }
454     return null;
455   }
456
457   /**
458    * 将指定的RSA密钥对以文件形式保存。
459    *
460    * @param keyPair 要保存的密钥对。
461    */
462   private static void saveKeyPair(KeyPair keyPair) {
463     FileOutputStream fos = null;
464     ObjectOutputStream oos = null;
465     try {
466       fos = FileUtils.openOutputStream(RSAUtils.rsaPairFile);
467       oos = new ObjectOutputStream(fos);
468       oos.writeObject(keyPair);
469     }
470     catch (Exception ex) {
471       ex.printStackTrace();
472     }
473     finally {
474       IOUtils.closeQuietly(oos);
475       IOUtils.closeQuietly(fos);
476     }
477   }
478 }
 1 /**
 2  * 存系数指数
 3  *
 4  */
 5 public class PublicKeyMap {
 6
 7   private String exponent;
 8
 9   private String modulus;
10
11   public String getExponent() {
12     return this.exponent;
13   }
14
15   public String getModulus() {
16     return this.modulus;
17   }
18
19   public void setExponent(String exponent) {
20     this.exponent = exponent;
21   }
22
23   public void setModulus(String modulus) {
24     this.modulus = modulus;
25   }
26
27   @Override
28   public String toString() {
29     return "PublicKeyMap [modulus=" + this.modulus + ", exponent="
30         + this.exponent + "]";
31   }
32 }
时间: 2024-09-30 06:35:51

RSA加密算法的相关文章

RSA加密算法的简单案例

RSA加密算法是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击. 那关于RSA加密算法有哪些应用呢?以下举一个数据库身份验证的案例. 在使用数据集进行身份认证时,密码存在数据库中,认证时用户输入的密码与数据库中密码相同则认证通过,若数据库被破解了则对系统造成威胁,怎样保证系统安全呢?这里就可以应用RSA加密算法,对权限加密. 思路: 就是在url中传用户名密码时,先把用户名进行翻转,然后再进行加密,如输入的密码为12,实际后台进行加密的值为21,再与数据库进行验证,这样

Java使用RSA加密算法对内容进行加密

什么是RSA加密算法 RSA是一种典型的非对称性加密算法,具体介绍可参考阮一峰的日志 RSA算法原理 下面是使用RSA算法对传输内容进行加密的一个简要Java案例,主要用到了三个类,大体实现如下: 对内容进行RSA加密和解密校验的类 import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.PKCS8Enco

RSA加密算法的加密与解密

转发原文链接:RSA加密算法加密与解密过程解析 1.加密算法概述 加密算法根据内容是否可以还原分为可逆加密和非可逆加密. 可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密和非对称加密. 所谓对称加密即是指在加密和解密时使用的是同一个密钥:举个简单的例子,对一个字符串C做简单的加密处理,对于每个字符都和A做异或,形成密文S.解密的时候再用密文S和密钥A做异或,还原为原来的字符串C.这种加密方式有一个很大的缺点就是不安全,因为一旦加密用的密钥泄露了之后,就可以用这个密钥破解其他所有的密文

RSA加密算法正确性证明

RSA加密算法是利用大整数分解耗时非常大来保证加密算法不被破译. 密钥的计算过程为:首先选择两个质数p和q,令n=p*q. 令k为n的欧拉函数,k=?(n)=(p−1)(q−1) 选择任意整数a,保证其与k互质 取整数b,使得a*b ≡1mod k 令公匙为a和n.私匙为p,q,b. 加密时算法为: 例如所发数位x,则所发过去的数据为 o = x^a mod n 解码时将可以得到x = o^b 正确性证明(1):?(n)=(p−1)(q−1) 成立的正确性 ?(n)表示小于n且与n互质数的个数

Android应用开发中如何使用RSA加密算法对数据进行校验

这个世界很精彩,这个世界很无奈.是的,在互联网时代,如何保护自己的数据,如何对数据进行加密和效验就变得非常的重要.这里总结一下Android平台使用Java语言,利用RSA算法对数据进行校验的经验. 先来看下如何RSA加密算法对数据进行校验的流程: 1.首先要用openssh之类的程序生成一个私钥 2.再根据私钥生成一个公钥 3.使用私钥和公钥,对数据进行签名,得到签名文件. 4.使用公钥和签名文件就可以对数据进行校验了. 再来看下如何实现: 1.生成2048位的私钥: openssl genr

轻松学习RSA加密算法原理

以前也接触过RSA加密算法,感觉这个东西太神秘了,是数学家的事,和我无关.但是,看了很多关于RSA加密算法原理的资料之后,我发现其实原理并不是我们想象中那么复杂,弄懂之后发现原来就只是这样而已.. 学过算法的朋友都知道,计算机中的算法其实就是数学运算.所以,再讲解RSA加密算法之前,有必要了解一下一些必备的数学知识.我们就从数学知识开始讲解. 必备数学知识 RSA加密算法中,只用到素数.互质数.指数运算.模运算等几个简单的数学知识.所以,我们也需要了解这几个概念即可. 素数 素数又称质数,指在一

RSA加密算法加密与解密过程解析

1.加密算法概述 加密算法根据内容是否可以还原分为 可逆加密和非可逆加密 . 可逆加密根据其加密解密是否使用的同一个密钥而可以分为 对称加密和非对称加密. 所谓对称加密即是指在加密和解密时使用的是同一个密钥:举个简单的例子,对一个字符串C做简单的加密处理,对于每个字符都和A做异或,形成密文S.解密的时候再用密文S和密钥A做异或,还原为原来的字符串C.这种加密方式有一个很大的缺点就是不安全,因为一旦加密用的密钥泄露了之后,就可以用这个密钥破解其他所有的密文. 非对称加密在加密和解密过程中使用不同的

浅谈RSA加密算法

一.什么是非对称加密 1.加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密 2.密钥分为:公钥,私钥  公钥:可以对外给任何人的加密和解密的密码,是公开的 私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑) 3.当将要加密的内容用公钥加密的时候,只能用私钥来解密 当将要加密的内容用私钥加密的时候,只能用公钥来解密 4.公钥与私钥的关系,利用一个简单的公式来生成公钥和私钥,即非对称加密的公钥和私钥之间存在某一个公式关系 5.常见的非对称加密算法 RSA,

[转] 用实例给新手讲解RSA加密算法

http://www.cfca.com.cn/zhishi/wz-012.htm PS: 通常公钥对数据加密,私钥对数据解密:私钥对数据签名,公钥对数据签名进行认证 RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化 而生动的描述,使得高深的数学理论能够被容易地理解.我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助. RSA是第一个比较完善的公开密钥算法,它既能用于加

Java培训 关于RSA加密算法有哪些应用呢?

Java培训 关于RSA加密算法有哪些应用呢? RSA加密算法是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击. Java培训关于RSA加密算法有哪些应用呢?以下举一个数据库身份验证的案例. 在使用数据集进行身份认证时,密码存在数据库中,认证时用户输入的密码与数据库中密码相同则认证通过,若数据库被破解了则对系统造成威胁,怎样保证系统安全呢?这里就可以应用RSA加密算法,对权限加密. 思路: 就是在url中传用户名密码时,先把用户名进行翻转,然后再进行加密,如输入的密码为