用java做的登录框 怎么给密码加密?
jdk 里面有个MessageDigest是实现md5加密的方法 你把用户输入的密码经过这个类进行md5加密 别人就不知道密码了 然后每次用户登陆 他输入的密码都要都用这个方法转换成md5串 进行匹配 就没人知道密码是什么了 这有个小例子 你可以看一下 package test;import javasecurityMessageDigest;
import javasecurityNoSuchAlgorithmException;public class MD5 {
public String str; public void transFormMD5(String text) {
try {
MessageDigest md = MessageDigestgetInstance("MD5");
mdupdate(textgetBytes());
byte b[] = mddigest();
int x; StringBuffer buf = new StringBuffer("");
for (int i = 0; i < blength; i++) {
x = b[i];
if (x < 0)
x += 256;
if (x < 16)
bufappend("0");
bufappend(IntegertoHexString(x));
}
str = buftoString();
Systemoutprintln("32位加密后的字符串: " + buftoString());// 32位的加密
Systemoutprintln("16位加密后的字符串: " + buftoString()substring(8, 24));// 16位的加密
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
eprintStackTrace(); }
} public static void main(String agrs[]) {
MD5 tm = new MD5();
tmtransFormMD5("password");//进行转换
}}
java加密字符串可以使用des加密算法,实例如下:
package test;
import javaioFileInputStream;
import javaioFileOutputStream;
import javaioIOException;
import javaioObjectInputStream;
import javaioObjectOutputStream;
import javasecurity;
import javaxcryptoCipher;
import javaxcryptoKeyGenerator;
import javaxcryptoSecretKey;
/
加密解密
@author shyqiu
@since
/
public class CryptTest {
/
进行MD5加密
@param info
要加密的信息
@return String 加密后的字符串
/
public String encryptToMD5(String info) {
byte[] digesta = null;
try {
// 得到一个md5的消息摘要
MessageDigest alga = MessageDigestgetInstance("MD5");
// 添加要进行计算摘要的信息
algaupdate(infogetBytes());
// 得到该摘要
digesta = algadigest();
} catch (NoSuchAlgorithmException e) {
eprintStackTrace();
}
// 将摘要转为字符串
String rs = byte2hex(digesta);
return rs;
}
/
进行SHA加密
@param info
要加密的信息
@return String 加密后的字符串
/
public String encryptToSHA(String info) {
byte[] digesta = null;
try {
// 得到一个SHA-1的消息摘要
MessageDigest alga = MessageDigestgetInstance("SHA-1");
// 添加要进行计算摘要的信息
algaupdate(infogetBytes());
// 得到该摘要
digesta = algadigest();
} catch (NoSuchAlgorithmException e) {
eprintStackTrace();
}
// 将摘要转为字符串
String rs = byte2hex(digesta);
return rs;
}
// //////////////////////////////////////////////////////////////////////////
/
创建密匙
@param algorithm
加密算法,可用 DES,DESede,Blowfish
@return SecretKey 秘密(对称)密钥
/
public SecretKey createSecretKey(String algorithm) {
// 声明KeyGenerator对象
KeyGenerator keygen;
// 声明 密钥对象
SecretKey deskey = null;
try {
// 返回生成指定算法的秘密密钥的 KeyGenerator 对象
keygen = KeyGeneratorgetInstance(algorithm);
// 生成一个密钥
deskey = keygengenerateKey();
} catch (NoSuchAlgorithmException e) {
eprintStackTrace();
}
// 返回密匙
return deskey;
}
/
根据密匙进行DES加密
@param key
密匙
@param info
要加密的信息
@return String 加密后的信息
/
public String encryptToDES(SecretKey key, String info) {
// 定义 加密算法,可用 DES,DESede,Blowfish
String Algorithm = "DES";
// 加密随机数生成器 (RNG),(可以不写)
SecureRandom sr = new SecureRandom();
// 定义要生成的密文
byte[] cipherByte = null;
try {
// 得到加密/解密器
Cipher c1 = CiphergetInstance(Algorithm);
// 用指定的密钥和模式初始化Cipher对象
// 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)
c1init(CipherENCRYPT_MODE, key, sr);
// 对要加密的内容进行编码处理,
cipherByte = c1doFinal(infogetBytes());
} catch (Exception e) {
eprintStackTrace();
}
// 返回密文的十六进制形式
return byte2hex(cipherByte);
}
/
根据密匙进行DES解密
@param key
密匙
@param sInfo
要解密的密文
@return String 返回解密后信息
/
public String decryptByDES(SecretKey key, String sInfo) {
// 定义 加密算法,
String Algorithm = "DES";
// 加密随机数生成器 (RNG)
SecureRandom sr = new SecureRandom();
byte[] cipherByte = null;
try {
// 得到加密/解密器
Cipher c1 = CiphergetInstance(Algorithm);
// 用指定的密钥和模式初始化Cipher对象
c1init(CipherDECRYPT_MODE, key, sr);
// 对要解密的内容进行编码处理
cipherByte = c1doFinal(hex2byte(sInfo));
} catch (Exception e) {
eprintStackTrace();
}
// return byte2hex(cipherByte);
return new String(cipherByte);
}
// /////////////////////////////////////////////////////////////////////////////
/
创建密匙组,并将公匙,私匙放入到指定文件中
默认放入mykeysbat文件中
/
public void createPairKey() {
try {
// 根据特定的算法一个密钥对生成器
KeyPairGenerator keygen = KeyPairGeneratorgetInstance("DSA");
// 加密随机数生成器 (RNG)
SecureRandom random = new SecureRandom();
// 重新设置此随机对象的种子
randomsetSeed(1000);
// 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器
keygeninitialize(512, random);// keygeninitialize(512);
// 生成密钥组
KeyPair keys = keygengenerateKeyPair();
// 得到公匙
PublicKey pubkey = keysgetPublic();
// 得到私匙
PrivateKey prikey = keysgetPrivate();
// 将公匙私匙写入到文件当中
doObjToFile("mykeysbat", new Object[] { prikey, pubkey });
} catch (NoSuchAlgorithmException e) {
eprintStackTrace();
}
}
/
利用私匙对信息进行签名 把签名后的信息放入到指定的文件中
@param info
要签名的信息
@param signfile
存入的文件
/
public void signToInfo(String info, String signfile) {
// 从文件当中读取私匙
PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeysbat", 1);
// 从文件中读取公匙
PublicKey mypubkey = (PublicKey) getObjFromFile("mykeysbat", 2);
try {
// Signature 对象可用来生成和验证数字签名
Signature signet = SignaturegetInstance("DSA");
// 初始化签署签名的私钥
signetinitSign(myprikey);
// 更新要由字节签名或验证的数据
signetupdate(infogetBytes());
// 签署或验证所有更新字节的签名,返回签名
byte[] signed = signetsign();
// 将数字签名,公匙,信息放入文件中
doObjToFile(signfile, new Object[] { signed, mypubkey, info });
} catch (Exception e) {
eprintStackTrace();
}
}
/
读取数字签名文件 根据公匙,签名,信息验证信息的合法性
@return true 验证成功 false 验证失败
/
public boolean validateSign(String signfile) {
// 读取公匙
PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);
// 读取签名
byte[] signed = (byte[]) getObjFromFile(signfile, 1);
// 读取信息
String info = (String) getObjFromFile(signfile, 3);
try {
// 初始一个Signature对象,并用公钥和签名进行验证
Signature signetcheck = SignaturegetInstance("DSA");
// 初始化验证签名的公钥
signetcheckinitVerify(mypubkey);
// 使用指定的 byte 数组更新要签名或验证的数据
signetcheckupdate(infogetBytes());
Systemoutprintln(info);
// 验证传入的签名
return signetcheckverify(signed);
} catch (Exception e) {
eprintStackTrace();
return false;
}
}
/
将二进制转化为16进制字符串
@param b
二进制字节数组
@return String
/
public String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < blength; n++) {
stmp = (javalangIntegertoHexString(b[n] & 0XFF));
if (stmplength() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hstoUpperCase();
}
/
十六进制字符串转化为2进制
@param hex
@return
/
public byte[] hex2byte(String hex) {
byte[] ret = new byte[8];
byte[] tmp = hexgetBytes();
for (int i = 0; i < 8; i++) {
ret[i] = uniteBytes(tmp[i 2], tmp[i 2 + 1]);
}
return ret;
}
/
将两个ASCII字符合成一个字节; 如:"EF"--> 0xEF
@param src0
byte
@param src1
byte
@return byte
/
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Bytedecode("0x" + new String(new byte[] { src0 }))
byteValue();
_b0 = (byte) (_b0 << 4);
byte _b1 = Bytedecode("0x" + new String(new byte[] { src1 }))
byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;
}
/
将指定的对象写入指定的文件
@param file
指定写入的文件
@param objs
要写入的对象
/
public void doObjToFile(String file, Object[] objs) {
ObjectOutputStream oos = null;
try {
FileOutputStream fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
for (int i = 0; i < objslength; i++) {
ooswriteObject(objs[i]);
}
} catch (Exception e) {
eprintStackTrace();
} finally {
try {
oosclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
/
返回在文件中指定位置的对象
@param file
指定的文件
@param i
从1开始
@return
/
public Object getObjFromFile(String file, int i) {
ObjectInputStream ois = null;
Object obj = null;
try {
FileInputStream fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
for (int j = 0; j < i; j++) {
obj = oisreadObject();
}
} catch (Exception e) {
eprintStackTrace();
} finally {
try {
oisclose();
} catch (IOException e) {
eprintStackTrace();
}
}
return obj;
}
/
测试
@param args
/
public static void main(String[] args) {
CryptTest jiami = new CryptTest();
// 执行MD5加密"Hello world!"
Systemoutprintln("Hello经过MD5:" + jiamiencryptToMD5("Hello"));
// 生成一个DES算法的密匙
SecretKey key = jiamicreateSecretKey("DES");
// 用密匙加密信息"Hello world!"
String str1 = jiamiencryptToDES(key, "Hello");
Systemoutprintln("使用des加密信息Hello为:" + str1);
// 使用这个密匙解密
String str2 = jiamidecryptByDES(key, str1);
Systemoutprintln("解密后为:" + str2);
// 创建公匙和私匙
jiamicreatePairKey();
// 对Hello world!使用私匙进行签名
jiamisignToInfo("Hello", "mysignbat");
// 利用公匙对签名进行验证。
if (jiamivalidateSign("mysignbat")) {
Systemoutprintln("Success!");
} else {
Systemoutprintln("Fail!");
}
}
}
md5加密,
package utilmd5;
public class Md5{
String hex_chr = "0123456789abcdef";
private String rhex(int num)
{
String str = "";
for(int j = 0; j <= 3; j++)
str = str + hex_chrcharAt((num >> (j 8 + 4)) & 0x0F) + hex_chrcharAt((num >> (j 8)) & 0x0F);
return str;
}
private int[] str2blks_MD5(String str)
{
int nblk = ((strlength() + 8) >> 6) + 1;
int[] blks = new int[nblk 16];
int i = 0;
for(i = 0; i < nblk 16; i++) {
blks[i] = 0;
}
for(i = 0; i < strlength(); i++) {
blks[i >> 2] |= strcharAt(i) << ((i % 4) 8);
}
blks[i >> 2] |= 0x80 << ((i % 4) 8);
blks[nblk 16 - 2] = strlength()8;
return blks;
}
private int add(int x, int y)
{
return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000);
}
private int rol(int num, int cnt)
{
return (num << cnt) | (num >>> (32 - cnt));
}
private int cmn(int q, int a, int b, int x, int s, int t)
{
return add(rol(add(add(a, q), add(x, t)), s), b);
}
private int ff(int a, int b, int c, int d, int x, int s, int t)
{
return cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
private int gg(int a, int b, int c, int d, int x, int s, int t)
{
return cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
private int hh(int a, int b, int c, int d, int x, int s, int t)
{
return cmn(b ^ c ^ d, a, b, x, s, t);
}
private int ii(int a, int b, int c, int d, int x, int s, int t)
{
return cmn(c ^ (b | (~d)), a, b, x, s, t);
}
public String calcMD5(String str)
{
int[] x = str2blks_MD5(str);
int a = 0x67452301;
int b = 0xEFCDAB89;
int c = 0x98BADCFE;
int d = 0x10325476;
for(int i = 0; i < xlength; i += 16)
{
int olda = a;
int oldb = b;
int oldc = c;
int oldd = d;
a = ff(a, b, c, d, x[i+ 0], 7 , 0xD76AA478);
d = ff(d, a, b, c, x[i+ 1], 12, 0xE8C7B756);
c = ff(c, d, a, b, x[i+ 2], 17, 0x242070DB);
b = ff(b, c, d, a, x[i+ 3], 22, 0xC1BDCEEE);
a = ff(a, b, c, d, x[i+ 4], 7 , 0xF57C0FAF);
d = ff(d, a, b, c, x[i+ 5], 12, 0x4787C62A);
c = ff(c, d, a, b, x[i+ 6], 17, 0xA8304613);
b = ff(b, c, d, a, x[i+ 7], 22, 0xFD469501);
a = ff(a, b, c, d, x[i+ 8], 7 , 0x698098D8);
d = ff(d, a, b, c, x[i+ 9], 12, 0x8B44F7AF);
c = ff(c, d, a, b, x[i+10], 17, 0xFFFF5BB1);
b = ff(b, c, d, a, x[i+11], 22, 0x895CD7BE);
a = ff(a, b, c, d, x[i+12], 7 , 0x6B901122);
d = ff(d, a, b, c, x[i+13], 12, 0xFD987193);
c = ff(c, d, a, b, x[i+14], 17, 0xA679438E);
b = ff(b, c, d, a, x[i+15], 22, 0x49B40821);
a = gg(a, b, c, d, x[i+ 1], 5 , 0xF61E2562);
d = gg(d, a, b, c, x[i+ 6], 9 , 0xC040B340);
c = gg(c, d, a, b, x[i+11], 14, 0x265E5A51);
b = gg(b, c, d, a, x[i+ 0], 20, 0xE9B6C7AA);
a = gg(a, b, c, d, x[i+ 5], 5 , 0xD62F105D);
d = gg(d, a, b, c, x[i+10], 9 , 0x02441453);
c = gg(c, d, a, b, x[i+15], 14, 0xD8A1E681);
b = gg(b, c, d, a, x[i+ 4], 20, 0xE7D3FBC8);
a = gg(a, b, c, d, x[i+ 9], 5 , 0x21E1CDE6);
d = gg(d, a, b, c, x[i+14], 9 , 0xC33707D6);
c = gg(c, d, a, b, x[i+ 3], 14, 0xF4D50D87);
b = gg(b, c, d, a, x[i+ 8], 20, 0x455A14ED);
a = gg(a, b, c, d, x[i+13], 5 , 0xA9E3E905);
d = gg(d, a, b, c, x[i+ 2], 9 , 0xFCEFA3F8);
c = gg(c, d, a, b, x[i+ 7], 14, 0x676F02D9);
b = gg(b, c, d, a, x[i+12], 20, 0x8D2A4C8A);
a = hh(a, b, c, d, x[i+ 5], 4 , 0xFFFA3942);
d = hh(d, a, b, c, x[i+ 8], 11, 0x8771F681);
c = hh(c, d, a, b, x[i+11], 16, 0x6D9D6122);
b = hh(b, c, d, a, x[i+14], 23, 0xFDE5380C);
a = hh(a, b, c, d, x[i+ 1], 4 , 0xA4BEEA44);
d = hh(d, a, b, c, x[i+ 4], 11, 0x4BDECFA9);
c = hh(c, d, a, b, x[i+ 7], 16, 0xF6BB4B60);
b = hh(b, c, d, a, x[i+10], 23, 0xBEBFBC70);
a = hh(a, b, c, d, x[i+13], 4 , 0x289B7EC6);
d = hh(d, a, b, c, x[i+ 0], 11, 0xEAA127FA);
c = hh(c, d, a, b, x[i+ 3], 16, 0xD4EF3085);
b = hh(b, c, d, a, x[i+ 6], 23, 0x04881D05);
a = hh(a, b, c, d, x[i+ 9], 4 , 0xD9D4D039);
d = hh(d, a, b, c, x[i+12], 11, 0xE6DB99E5);
c = hh(c, d, a, b, x[i+15], 16, 0x1FA27CF8);
b = hh(b, c, d, a, x[i+ 2], 23, 0xC4AC5665);
a = ii(a, b, c, d, x[i+ 0], 6 , 0xF4292244);
d = ii(d, a, b, c, x[i+ 7], 10, 0x432AFF97);
c = ii(c, d, a, b, x[i+14], 15, 0xAB9423A7);
b = ii(b, c, d, a, x[i+ 5], 21, 0xFC93A039);
a = ii(a, b, c, d, x[i+12], 6 , 0x655B59C3);
d = ii(d, a, b, c, x[i+ 3], 10, 0x8F0CCC92);
c = ii(c, d, a, b, x[i+10], 15, 0xFFEFF47D);
b = ii(b, c, d, a, x[i+ 1], 21, 0x85845DD1);
a = ii(a, b, c, d, x[i+ 8], 6 , 0x6FA87E4F);
d = ii(d, a, b, c, x[i+15], 10, 0xFE2CE6E0);
c = ii(c, d, a, b, x[i+ 6], 15, 0xA3014314);
b = ii(b, c, d, a, x[i+13], 21, 0x4E0811A1);
a = ii(a, b, c, d, x[i+ 4], 6 , 0xF7537E82);
d = ii(d, a, b, c, x[i+11], 10, 0xBD3AF235);
c = ii(c, d, a, b, x[i+ 2], 15, 0x2AD7D2BB);
b = ii(b, c, d, a, x[i+ 9], 21, 0xEB86D391);
a = add(a, olda);
b = add(b, oldb);
c = add(c, oldc);
d = add(d, oldd);
}
return rhex(a) + rhex(b) + rhex(c) + rhex(d);
}
public static void main(String[] args)
{
Md5 md = new Md5();
String input;
if (argslength==0) input = "璁捐绷鏁;
else input = args[0];
Systemoutprintln(input);
String str = mdcalcMD5(input);
Systemoutprintln(str);
}
}
提供加密,解密,生成密钥对等方法。�梢愿�模��遣灰��螅�裨蛐�驶岬� keyPairGeninitialize(KEY_SIZE, new SecureRandom()); KeyPair keyPair = keyPairGengenKeyPair(); return keyPair; } catch (Exception e) { throw new Exception(egetMessage()); } } / 生成公钥 @param modulus @param publicExponent @return RSAPublicKey @throws Exception / public static RSAPublicKey generateRSAPublicKey(byte[] modulus, byte[] publicExponent) throws Exception { KeyFactory keyFac = null; try { keyFac = KeyFactorygetInstance("RSA", new orgbouncycastlejceproviderBouncyCastleProvider()); } catch (NoSuchAlgorithmException ex) { throw new Exception(exgetMessage()); } RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent)); try { return (RSAPublicKey) keyFacgeneratePublic(pubKeySpec); } catch (InvalidKeySpecException ex) { throw new Exception(exgetMessage()); } } / 生成私钥 @param modulus @param privateExponent @return RSAPrivateKey @throws Exception / public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus, byte[] privateExponent) throws Exception { KeyFactory keyFac = null; try { keyFac = KeyFactorygetInstance("RSA", new orgbouncycastlejceproviderBouncyCastleProvider()); } catch (NoSuchAlgorithmException ex) { throw new Exception(exgetMessage()); } RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus), new BigInteger(privateExponent)); try { return (RSAPrivateKey) keyFacgeneratePrivate(priKeySpec); } catch (InvalidKeySpecException ex) { throw new Exception(exgetMessage()); } } / 加密 @param key 加密的密钥 @param data 待加密的明文数据 @return 加密后的数据 @throws Exception / public static byte[] encrypt(Key key, byte[] data) throws Exception { try { Cipher cipher = CiphergetInstance("RSA", new orgbouncycastlejceproviderBouncyCastleProvider()); cipherinit(CipherENCRYPT_MODE, key); int blockSize = ciphergetBlockSize();//获得加密块大小� i++; } return raw; } catch (Exception e) { throw new Exception(egetMessage()); } } / 解密 @param key 解密的密钥 @param raw 已经加密的数据 @return 解密后的明文 @throws Exception / public static byte[] decrypt(Key key, byte[] raw) throws Exception { try { Cipher cipher = CiphergetInstance("RSA", new orgbouncycastlejceproviderBouncyCastleProvider()); cipherinit(cipherDECRYPT_MODE, key); int blockSize = ciphergetBlockSize(); ByteArrayOutputStream bout = new ByteArrayOutputStream(64); int j = 0; while (rawlength - j blockSize > 0) { boutwrite(cipherdoFinal(raw, j blockSize, blockSize)); j++; } return bouttoByteArray(); } catch (Exception e) { throw new Exception(egetMessage()); } } / @param args @throws Exception / public static void main(String[] args) throws Exception { File file = new File("c:/testhtml"); FileInputStream in = new FileInputStream(file); ByteArrayOutputStream bout = new ByteArrayOutputStream(); byte[] tmpbuf = new byte[1024]; int count = 0; while ((count = inread(tmpbuf)) != -1) { boutwrite(tmpbuf, 0, count); tmpbuf = new byte[1024]; } inclose(); byte[] orgData = bouttoByteArray(); KeyPair keyPair = RSAgenerateKeyPair(); RSAPublicKey pubKey = (RSAPublicKey) keyPairgetPublic(); RSAPrivateKey priKey = (RSAPrivateKey) keyPairgetPrivate(); byte[] pubModBytes = pubKeygetModulus()toByteArray(); byte[] pubPubExpBytes = pubKeygetPublicExponent()toByteArray(); byte[] priModBytes = priKeygetModulus()toByteArray(); byte[] priPriExpBytes = priKeygetPrivateExponent()toByteArray(); RSAPublicKey recoveryPubKey = RSAgenerateRSAPublicKey(pubModBytes,pubPubExpBytes); RSAPrivateKey recoveryPriKey = RSAgenerateRSAPrivateKey(priModBytes,priPriExpBytes); byte[] raw = RSAencrypt(priKey, orgData); file = new File("c:/encrypt_resultdat"); OutputStream out = new FileOutputStream(file); outwrite(raw); outclose(); byte[] data = RSAdecrypt(recoveryPubKey, raw); file = new File("c:/decrypt_resulthtml"); out = new FileOutputStream(file); outwrite(data); outflush(); outclose(); } } (责任编辑:云子)
我们在开发过程中,肯定会有和第三方或者app端的接口调用。在调用的时候,下面的方法可以来防止非法链接或者恶意攻击。
一、签名
根据用户名或者用户id,结合用户的ip或者设备号,生成一个token。在请求后台,后台获取http的head中的token,校验是否合法(和数据库或者Redis中记录的是否一致,在登录或者初始化的时候,存入数据库/redis)
在使用Base64方式的编码后,Token字符串还是有20多位,有的时候还是嫌它长了。由于GUID本身就有128bit,在要求有良好的可读性的前提下,很难进一步改进了。那我们如何产生更短的字符串呢?还有一种方式就是较少Token的长度,不用GUID,而采用一定长度的随机数,例如64bit,再用Base64编码表示:
var rnd = new Random();
var tokenData = userIp+userId;
rndNextBytes(tokenData);
var token = ConvertToBase64String(tokenData)TrimEnd('=');
由于这里只用了64bit,此时得到的字符串为Onh0h95n7nw的形式,长度要短一半。这样就方便携带多了。但是这种方式是没有唯一性保证的。不过用来作为身份认证的方式还是可以的(如网盘的提取码)。
二、加密
客户端和服务器都保存一个秘钥,每次传输都加密,服务端根据秘钥解密。
客户端:
1、设置一个key(和服务器端相同)
2、根据上述key对请求进行某种加密(加密必须是可逆的,以便服务器端解密)
3、发送请求给服务器
服务器端:
1、设置一个key
2、根据上述的key对请求进行解密(校验成功就是「信任」的客户端发来的数据,否则拒绝响应)
3、处理业务逻辑并产生结果
4、将结果反馈给客户端
三、第三方支持
比如spring security-oauth
0条评论