There is a requirement, the user name password of the front-end login, password must be encrypted, but not use MD5, because the background to detect the complexity of the password, then in the premise of ensuring security to the background of the password, the answer is to use the RSA Asymmetric encryption algorithm to solve.
Java code
need to rely on COMMONS-CODEC packages
Rsacoder.java
ImportOrg.apache.commons.codec.binary.Base64;ImportJavax.crypto.Cipher;Importjava.security.*;ImportJava.security.spec.PKCS8EncodedKeySpec;ImportJava.security.spec.X509EncodedKeySpec;ImportJava.util.HashMap;ImportJava.util.Map;/** * Created by Lake on 17-4-12. * * Public class rsacoder { Public Static FinalString Key_algorithm ="RSA"; Public Static FinalString Signature_algorithm ="Md5withrsa";Private Static FinalString Public_key ="Rsapublickey";Private Static FinalString Private_key ="Rsaprivatekey"; Public Static byte[]decryptBASE64(String key) {returnBase64.decodebase64 (key); } Public StaticStringencryptBASE64(byte[] bytes) {returnBase64.encodebase64string (bytes); }/** * Digitally sign information with private key * * @param Data encrypted * @param privatekey private key * @retu RN * @throws Exception * * Public StaticString Sign(byte[] data, String Privatekey)throwsException {//Decrypt private key encoded by Base64 byte[] keybytes = decryptBASE64 (Privatekey);//Construct Pkcs8encodedkeyspec objectPkcs8encodedkeyspec Pkcs8keyspec =NewPkcs8encodedkeyspec (keybytes);//Key_algorithm The specified encryption algorithmKeyfactory keyfactory = keyfactory.getinstance (key_algorithm);//Take private Key ObjectPrivatekey Prikey = keyfactory.generateprivate (Pkcs8keyspec);//Generate digital signatures for information with private keySignature Signature = signature.getinstance (signature_algorithm); Signature.initsign (Prikey); Signature.update (data);returnEncryptBASE64 (Signature.sign ()); }/** * Verify Digital signature * * @param Data encryption * @param publickey Public key * @param s IGN Digital Signature * @return Verify Success Returns TRUE Failure returns false * @throws Exception * / Public Static Boolean Verify(byte[] Data, string publickey, string sign)throwsException {//Decrypt the public key encoded by Base64 byte[] keybytes = decryptBASE64 (PublicKey);//Construct X509encodedkeyspec objectX509encodedkeyspec KeySpec =NewX509encodedkeyspec (keybytes);//Key_algorithm The specified encryption algorithmKeyfactory keyfactory = keyfactory.getinstance (key_algorithm);//Take the Public key objectPublicKey PubKey = Keyfactory.generatepublic (KeySpec); Signature Signature = signature.getinstance (signature_algorithm); Signature.initverify (PubKey); Signature.update (data);//Verify that the signature is normal returnSignature.verify (decryptBASE64 (sign)); } Public Static byte[]Decryptbyprivatekey(byte[] data, String key)throwsexception{//decryption of keys byte[] keybytes = decryptBASE64 (key);//Get the private keyPkcs8encodedkeyspec Pkcs8keyspec =NewPkcs8encodedkeyspec (keybytes); Keyfactory keyfactory = keyfactory.getinstance (key_algorithm); Key Privatekey = keyfactory.generateprivate (Pkcs8keyspec);//decryption of dataCipher Cipher = cipher.getinstance (Keyfactory.getalgorithm ()); Cipher.init (Cipher.decrypt_mode, Privatekey);returnCipher.dofinal (data); }/** * Decrypt <br> * Decrypt with private key * * @param data * @param key * @return * @throws Exception * * Public Static byte[]Decryptbyprivatekey(string data, string key)throwsException {returnDecryptbyprivatekey (decryptBASE64 (data), key); }/** * Decrypt <br> * Decrypt with public key * * @param data * @param key * @return * @throws Exception * * Public Static byte[]Decryptbypublickey(byte[] data, String key)throwsException {//decryption of keys byte[] keybytes = decryptBASE64 (key);//Get public keyX509encodedkeyspec X509keyspec =NewX509encodedkeyspec (keybytes); Keyfactory keyfactory = keyfactory.getinstance (key_algorithm); Key PublicKey = Keyfactory.generatepublic (X509keyspec);//decryption of dataCipher Cipher = cipher.getinstance (Keyfactory.getalgorithm ()); Cipher.init (Cipher.decrypt_mode, PublicKey);returnCipher.dofinal (data); }/** * Encrypt <br> * Encrypt with public key * * @param data * @param key * @return * @throws Exception * * Public Static byte[]Encryptbypublickey(string data, string key)throwsException {//Decrypt the public key byte[] keybytes = decryptBASE64 (key);//Get public keyX509encodedkeyspec X509keyspec =NewX509encodedkeyspec (keybytes); Keyfactory keyfactory = keyfactory.getinstance (key_algorithm); Key PublicKey = Keyfactory.generatepublic (X509keyspec);//Encryption of dataCipher Cipher = cipher.getinstance (Keyfactory.getalgorithm ()); Cipher.init (Cipher.encrypt_mode, PublicKey);returnCipher.dofinal (Data.getbytes ()); }/** * Encrypt <br> * Encrypt with private key * * @param data * @param key * @return * @throws Exception * * Public Static byte[]Encryptbyprivatekey(byte[] data, String key)throwsException {//decryption of keys byte[] keybytes = decryptBASE64 (key);//Get the private keyPkcs8encodedkeyspec Pkcs8keyspec =NewPkcs8encodedkeyspec (keybytes); Keyfactory keyfactory = keyfactory.getinstance (key_algorithm); Key Privatekey = keyfactory.generateprivate (Pkcs8keyspec);//Encryption of dataCipher Cipher = cipher.getinstance (Keyfactory.getalgorithm ()); Cipher.init (Cipher.encrypt_mode, Privatekey);returnCipher.dofinal (data); }/** * Get the private key * * @param keyMap * @return * @throws Exception */ Public StaticStringGetprivatekey(map<string, key> keyMap)throwsException {Key key = (key) keymap.get (Private_key);returnEncryptBASE64 (key.getencoded ()); }/** * Get public key * * @param keyMap * @return * @throws Exception */ Public StaticStringGetpublickey(map<string, key> keyMap)throwsException {Key key = Keymap.get (Public_key);returnEncryptBASE64 (key.getencoded ()); }/** * Initialize key * * @return * @throws Exception */ Public StaticMap<string, key>Initkey()throwsException {keypairgenerator Keypairgen = keypairgenerator. getinstance (Key_algorithm); Keypairgen.initialize (1024x768); KeyPair KeyPair = Keypairgen.generatekeypair (); map<string, key> KeyMap =NewHashMap (2); Keymap.put (Public_key, Keypair.getpublic ());//Public keyKeymap.put (Private_key, Keypair.getprivate ());//private key returnKeyMap; }}
Test class
Rsacodertest.java
ImportOrg.junit.Before;ImportOrg.junit.Test;ImportJava.security.Key;ImportJava.util.Map;Import StaticOrg.junit.Assert.assertEquals;Import StaticOrg.junit.Assert.assertTrue;/** * Created by Lake on 17-4-12. * * Public class rsacodertest { PrivateString PublicKey;PrivateString Privatekey;@Before Public void setUp()throwsException {map<string, key> keyMap = Rsacoder.initkey (); PublicKey = Rsacoder.getpublickey (KEYMAP); Privatekey = Rsacoder.getprivatekey (KEYMAP); System.err.println ("Public key: \n\r"+ PublicKey); System.err.println ("Private key: \n\r"+ Privatekey); }@Test Public void Test()throwsException {System.err.println ("Public key cryptography--private key decryption"); String Inputstr ="ABC";byte[] Encodeddata = Rsacoder.encryptbypublickey (Inputstr, PublicKey);byte[] Decodeddata = Rsacoder.decryptbyprivatekey (Encodeddata, Privatekey); String Outputstr =NewString (Decodeddata); System.err.println ("before encryption:"+ Inputstr +"\n\r"+"After decryption:"+ outputstr); Assertequals (Inputstr, OUTPUTSTR); }@Test Public void testsign()throwsException {System.err.println ("Private key encryption--public key decryption"); String Inputstr ="Sign";byte[] data = Inputstr.getbytes ();byte[] Encodeddata = Rsacoder.encryptbyprivatekey (data, Privatekey);byte[] Decodeddata = Rsacoder.decryptbypublickey (Encodeddata, PublicKey); String Outputstr =NewString (Decodeddata); System.err.println ("before encryption:"+ Inputstr +"\n\r"+"After decryption:"+ outputstr); Assertequals (Inputstr, OUTPUTSTR); System.err.println ("Private key signature--public key verification signature");//Generate signatureString sign = rsacoder.sign (Encodeddata, Privatekey); System.err.println ("Signature:"+ sign);//Verify signature BooleanStatus = Rsacoder.verify (Encodeddata, PublicKey, sign); System.err.println ("Status:"+ status); Asserttrue (status); }}
Front-end Code
Dependent Jsencrypt Project
<script src="bin/jsencrypt.min.js"></script><script type="text/javascript"> var encrypt = new JSEncrypt(); encrypt.setPublicKey(‘java生成的公钥‘); var encrypted = encrypt.encrypt(‘加密的字符串‘);</script>
Description
The front-end generates encrypted strings, which are encrypted
uploaded to the background and Java is decrypted with the private key.
RSA algorithm JS encrypted Java decryption