当前位置:   article > 正文

前后端登录注册密码加密方式_前端和后台账号密码交互用什么加密

前端和后台账号密码交互用什么加密

方式1:前端不加密 + 后端加密

目的:后端不直接存储密码明文。

1)注册:后端接收前端传输的密码明文后,使用不可逆的加密(如hash)对其加密后存入数据库

2)登录:后端接收前端传输的密码明文后,将密码与数据库中密文进行对比验证(验证方法据实际加密方式而定)。

示例:

java后端加密:

  1. import java.security.MessageDigest;
  2. import java.security.NoSuchAlgorithmException;
  3. public class HashUtil {
  4. public static String hash(String password) {
  5. try {
  6. // 创建MessageDigest对象,指定使用MD5算法
  7. MessageDigest md = MessageDigest.getInstance("MD5");
  8. // 将密码转换为byte数组
  9. byte[] passwordBytes = password.getBytes();
  10. // 使用指定的byte数组更新摘要
  11. md.update(passwordBytes);
  12. // 获取摘要的字节数组
  13. byte[] digest = md.digest();
  14. // 将字节数组转换为十六进制字符串
  15. StringBuilder sb = new StringBuilder();
  16. for (byte b : digest) {
  17. sb.append(String.format("%02x", b));
  18. }
  19. return sb.toString();
  20. } catch (NoSuchAlgorithmException e) {
  21. e.printStackTrace();
  22. }
  23. return null;
  24. }
  25. public static boolean verify(String password, String hashedPassword) {
  26. // 对输入的密码进行加密
  27. String encryptedPassword = hash(password);
  28. // 验证加密后的密码与哈希值是否相等
  29. return hashedPassword.equals(encryptedPassword);
  30. }
  31. public static void main(String[] args) {
  32. String password = "password";
  33. // 对密码进行哈希加密
  34. String hashedPassword = hash(password);
  35. System.out.println("哈希值:" + hashedPassword);
  36. // 验证密码
  37. boolean result = verify(password, hashedPassword);
  38. System.out.println("验证结果:" + result);
  39. }
  40. }

方式2:前端加密 + 后端加密

目的:前端密码传输不直接暴露密码明文,后端不直接存储密码明文

1)注册:前端使用可解密的加密算法加密密码明文,后端拿到加密后的密码密文并解密,然后对其进行不可逆的加密(如hash)后存入数据库;

2)登录:前端使用可解密的加密算法加密密码明文,后端拿到加密后的密码密文并解密,将解密后的密码与数据库中密文进行对比验证(验证方法据实际加密方式而定)。

示例:示例只展示前端加密,后端解密过程,后端加密参照方式1。

前端加密:
  1. // 密钥,需要与后端保持一致
  2. var key = CryptoJS.enc.Utf8.parse("1234567890123456");
  3. // 加密函数
  4. function encryptParam(param) {
  5. var encrypted = CryptoJS.AES.encrypt(JSON.stringify(param), key, {
  6. mode: CryptoJS.mode.ECB,
  7. padding: CryptoJS.pad.Pkcs7
  8. });
  9. return encrypted.toString();
  10. }
  11. // 请求参数
  12. var param = {
  13. username: "admin",
  14. password: "123456"
  15. };
  16. // 加密请求参数
  17. var encryptedParam = encryptParam(param);
  18. // 发送加密后的参数到后端
  19. // ...

java后端解密:
  1. import javax.crypto.Cipher;
  2. import javax.crypto.spec.SecretKeySpec;
  3. import java.util.Base64;
  4. public class AESUtil {
  5. private static final String KEY = "1234567890123456"; // 密钥,需要与前端保持一致
  6. public static String decrypt(String encryptedParam) {
  7. try {
  8. byte[] encryptedBytes = Base64.getDecoder().decode(encryptedParam);
  9. SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), "AES");
  10. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  11. cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
  12. byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
  13. return new String(decryptedBytes);
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. return null;
  17. }
  18. }
  19. }
注:本文只记录前后端密码加解密逻辑及方式,不讨论安全性问题,纯菜鸡呜呜呜。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/581629
推荐阅读
相关标签
  

闽ICP备14008679号