精华内容
下载资源
问答
  • Java如何实现密码加密
    千次阅读
    2021-03-16 15:07:01

    在查询时,我们如果要对用户的登录信息进行加密,通常会将其密码进行加密.

    1) 可以借助spring框架工具类DigestUtils

    2) 也可以使用shiro框架来实现

    //保存用户自身信息

    //1构建一个盐值对象

    String salt=UUID.randomUUID().toString();//随机字符串

    //2对密码进行盐值加密(加密算法MD5-特点:不可逆,相同内容加密结果也相同)

    //2.1加密方式1(借助spring框架工具类DigestUtils)

    //String newPassword=DigestUtils.md5DigestAsHex((salt+entity.getPassword()).getBytes());

    //2.2加密方式2(借助shiro框架中的API)

    SimpleHash sh=new SimpleHash("MD5", entity.getPassword(), salt, 1);

    String newPassword=sh.toHex();

    System.out.println("newPassword="+newPassword);

    entity.setSalt(salt);

    entity.setPassword(newPassword);

    以上就是两者方式分别使用,

    注意:

    盐值salt:UUID.randomUUID().toString();生成的是一个随机字符串.

    SimpleHash sh=new SimpleHash("MD5", entity.getPassword(), salt, 1);

    这行shiro框架提供的加密中,

    第一个参数"MD5"为加密算法,其特点:不可逆(只能加密不能解密),但是相同内容加密结果也相同;

    第二个参数source,代表原密码;

    第三个参数salt,就是我们先生成的盐值随机数;

    第四个参数1,代表加密次数,我们这里只加密了一次.

    entity.setSalt(salt);

    entity.setPassword(sh.toHex());

    加密处理过后,我们再将新修改的密码转换为16进制数赋值给对象,salt的传递看你对象属性的设置.

    然后再根据新的对象内的数据进行操作即可.

    以上就是Java如何实现密码加密的详细内容,更多关于Java密码加密的资料请关注我们其它相关文章!

    时间: 2020-08-18

    更多相关内容
  • shiro密码加密

    千次阅读 2022-01-18 20:28:45
    shiro密码加密 文章目录shiro密码加密1 MD5加密2 MD5盐值加密 1 MD5加密 在配置文件中设置自定义Realm对象的属性开启MD5加密 @Bean public ShiroRealm userRealm(){ ShiroRealm realm = new ShiroRealm(); //设置...

    shiro密码加密

    1 MD5加密

    在配置文件中设置自定义Realm对象的属性开启MD5加密

    @Bean
    public ShiroRealm userRealm(){
        ShiroRealm realm = new ShiroRealm();
        //设置加密算法为md5
        HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
        credentialsMatcher.setHashAlgorithmName("md5");
        //设置加密次数
        credentialsMatcher.setHashIterations(1024);
        realm.setCredentialsMatcher(credentialsMatcher);
        return realm;
    }
    

    在获取前端的密码后会在Realm中自动调用SimpleAuthenticationInfo(user,user.getPwd(),this.getName());

    进行加密比较,具体的比较过程在该对象的源码中。

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken userToken = (UsernamePasswordToken) token;
        UserEntity user = userService.findUserByName(userToken.getUsername());
        if (user!=null){
            log.info("密码:"+user.getPwd());
            System.out.println("密码"+user.getPwd());
            //匹配从数据库获取的到密码与前端传递的密码时候相同
            return new SimpleAuthenticationInfo(user,user.getPwd(),this.getName());
        }
        return null;
    }
    

    仅使用MD5加密的缺点:如果两个人的密码一样则数据里的密文也一样,任然存在不安全性。

    2 MD5盐值加密

    盐值一般是唯一的字符串,用用户名代替或者使用随机字符串,其数据类型是byte

    可以使用ByteSource接口下的Util.bytes将字符串装换为byte

    ByteSource salt = ByteSource.Util.bytes(user.getUserName());
    

    具体使用如下:

    ShiroConfig中还是设置自定义Realm对象的属性开启MD5加密。

    在Realm的重写方法中使用盐值加密匹配即可

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken userToken = (UsernamePasswordToken) token;
        UserEntity user = userService.findUserByName(userToken.getUsername());
        if (user!=null){
            log.info("密码:"+user.getPwd());
            log.info("thisName:"+this.getName());
            //盐值加密
            /*
                1. 以用户名作为盐值
            */
            log.info("userName:"+user.getUserName());
            ByteSource salt = ByteSource.Util.bytes(user.getUserName());
            log.info("salt:"+salt);
            //匹配从数据库获取的到密码与前端传递的密码时候相同
            return new SimpleAuthenticationInfo(user,user.getPwd(),salt,this.getName());
        }
        return null;
    }
    
    展开全文
  • 常见登录密码加密方式

    千次阅读 2021-02-16 17:48:09
    不可逆加密算法1.3.Base64编码2 密码加密的方式选型2.1 MD5密码加密2.2 手动加密(md5+随机字符串)2.3 . BCrypt密码加密3 jwt介绍3.1 token认证-面试3.2 什么是JWT?3.3 生成token 1 常见的加密方式 由于在学习JWT...


    1 常见的加密方式

    由于在学习JWT的时候会涉及使用很多加密算法, 所以在这里做下扫盲, 简单了解就可以

    加密算法种类有:

    1.1.可逆加密算法

    解释: 加密后, 密文可以反向解密得到密码原文.

    1.1.1. 对称加密

    用的较少因为不安全,要把秘钥也给别人

    文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥

    在这里插入图片描述

    解释: 在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊的加密算法处理后,使其变成复杂的加密密文发送出去,收信方收到密文后,若想解读出原文,则需要使用加密时用的密钥以及相同加密算法的逆算法对密文进行解密,才能使其回复成可读明文。在对称加密算法中,使用的密钥只有一个,收发双方都使用这个密钥,这就需要解密方事先知道加密密钥。

    优点: 对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。

    缺点: 没有非对称加密安全.

    用途: 一般用于保存用户手机号、身份证等敏感但能解密的信息。

    常见的对称加密算法有: AES、DES、3DES、Blowfish、IDEA、RC4、RC5、RC6、HS256

    1.1.2. 非对称加密

    两个密钥:公开密钥(publickey)和私有密钥,公有密钥加密,私有密钥解密

    在这里插入图片描述

    **解释: ** 同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端.

    加密与解密:

    • 私钥加密,持有公钥才可以解密
    • 公钥加密,持有私钥才可解密

    签名:

    • 私钥签名, 持有公钥进行验证是否被篡改过.

    **优点: ** 非对称加密与对称加密相比,其安全性更好;

    缺点: 非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
    用途: 一般用于签名和认证。私钥服务器保存, 用来加密, 公钥客户拿着用于对于令牌或者签名的解密或者校验使用.

    常见的非对称加密算法有: RSA、DSA(数字签名用)、ECC(移动设备用)、RS256 (采用SHA-256 的 RSA 签名)

    1.2.不可逆加密算法

    解释: 一旦加密就不能反向解密得到密码原文.

    种类: Hash加密算法, 散列算法, 摘要算法等

    **用途:**一般用于效验下载文件正确性,一般在网站上下载文件都能见到;存储用户敏感信息,如密码、 卡号等不可解密的信息。

    常见的不可逆加密算法有: MD5、SHA、HMAC

    1.3.Base64编码

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息。采用Base64Base64编码解码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。注意:Base64只是一种编码方式,不算加密方法。

    在线编码工具:

    http://www.jsons.cn/img2base64/

    2 密码加密的方式选型

    common工程test下测试

    2.1 MD5密码加密

    在这里插入图片描述

    java //md5加密 DegestUtils:spring框架提供的工具类 String md5Str = DigestUtils.md5DigestAsHex("abc".getBytes()); System.out.println(md5Str);//900150983cd24fb0d6963f7d28e17f72 ​

    md5相同的密码每次加密都一样,不太安全

    2.2 手动加密(md5+随机字符串)

    在md5的基础上手动加盐(salt)处理

    
    //uername:zhangsan  password:123   salt:随时字符串
    String salt = RandomStringUtils.randomAlphanumeric(10);//获取一个10位的随机字符串
    System.out.println(salt);
    String pswd = "123"+salt;
    
    String saltPswd = DigestUtils.md5DigestAsHex(pswd.getBytes());
    System.out.println(saltPswd);
    

    这样同样的密码,加密多次值是不相同的,因为加入了随机字符串

    2.3 . BCrypt密码加密

    在用户模块,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。 目前,MD5和BCrypt比较流行。相对来说,BCrypt比MD5更安全。

    BCrypt 官网http://www.mindrot.org/projects/jBCrypt/
    在这里插入图片描述
    在这里插入图片描述

    (1)我们从官网下载源码

    (2)新建工程,将源码类BCrypt拷贝到工程

    (3)新建测试类,main方法中编写代码,实现对密码的加密

    java String gensalt = BCrypt.gensalt();//这个是盐 29个字符,随机生成 System.out.println(gensalt); String password = BCrypt.hashpw("123456", gensalt); //根据盐对密码进行加密 System.out.println(password);//加密后的字符串前29位就是盐 ​

    (4)新建测试类,main方法中编写代码,实现对密码的校验。BCrypt不支持反运算,只支持密码校验。

    java boolean checkpw = BCrypt.checkpw("123456", "$2a$10$61ogZY7EXsMDWeVGQpDq3OBF1.phaUu7.xrwLyWFTOu8woE08zMIW"); System.out.println(checkpw); ​

    3 jwt介绍

    3.1 token认证-面试

    随着 Restful API、微服务的兴起,基于 Token 的认证现在已经越来越普遍。基于token的用户认证是一种服务端无状态的认证方式,所谓服务端无状态指的token本身包含登录用户所有的相关数据,而客户端在认证后的每次请求都会携带token,因此服务器端无需存放token数据。

    当用户认证后,服务端生成一个token发给客户端,客户端可以放到 cookie 或 localStorage 等存储中,每次请求时带上 token,服务端收到token通过验证后即可确认用户身份。

    在这里插入图片描述

    3.2 什么是JWT?

    我们现在了解了基于token认证的交互机制,但令牌里面究竟是什么内容?什么格式呢?市面上基于token的认证方式大都采用的是JWT(Json Web Token)。

    JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。

    JWT令牌结构:

    JWT令牌由Header、Payload、Signature三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz

    • Header

    头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC、SHA256或RSA)。

    一个例子:

    json { "alg": "HS256", "typ": "JWT" } ​

    将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。

    • Payload

    第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比
    如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。
    此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。
    一个例子:

    json { "sub": "1234567890", "name": "456", "admin": true } ​

    最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。

    • Signature

    第三部分是签名,此部分用于防止jwt内容被篡改。
    这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明
    签名算法进行签名。
    一个例子:

    shell HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret) ​

    base64UrlEncode(header):jwt令牌的第一部分。
    base64UrlEncode(payload):jwt令牌的第二部分。
    secret:签名所使用的密钥。

    下图中包含一个生成的jwt令牌:

    在这里插入图片描述

    3.3 生成token

    查看utils工程

    需要引入jwt相关依赖

    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
    </dependency>
    

    工具类

    package com.oldlu.utils.common;
    
    import io.jsonwebtoken.*;
    
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import java.util.*;
    
    public class AppJwtUtil {
    
        // TOKEN的有效期一天(S)
        private static final int TOKEN_TIME_OUT = 3_600;
        // 加密KEY
        private static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";
        // 最小刷新间隔(S)
        private static final int REFRESH_TIME = 300;
    
        // 生产ID
        public static String getToken(Long id){
            Map<String, Object> claimMaps = new HashMap<>();
            claimMaps.put("id",id);
            long currentTime = System.currentTimeMillis();
            return Jwts.builder()
                    .setId(UUID.randomUUID().toString())
                    .setIssuedAt(new Date(currentTime))  //签发时间
                    .setSubject("system")  //说明
                    .setIssuer("oldlu") //签发者信息
                    .setAudience("app")  //接收用户
                    .compressWith(CompressionCodecs.GZIP)  //数据压缩方式
                    .signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式
                    .setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000))  //过期时间戳
                    .addClaims(claimMaps) //cla信息
                    .compact();
        }
    
        /**
         * 获取token中的claims信息
         *
         * @param token
         * @return
         */
        private static Jws<Claims> getJws(String token) {
                return Jwts.parser()
                        .setSigningKey(generalKey())
                        .parseClaimsJws(token);
        }
    
        /**
         * 获取payload body信息
         *
         * @param token
         * @return
         */
        public static Claims getClaimsBody(String token) {
            try {
                return getJws(token).getBody();
            }catch (ExpiredJwtException e){
                return null;
            }
        }
    
        /**
         * 获取hearder body信息
         *
         * @param token
         * @return
         */
        public static JwsHeader getHeaderBody(String token) {
            return getJws(token).getHeader();
        }
    
        /**
         * 是否过期
         *
         * @param claims
         * @return -1:有效,0:有效,1:过期,2:过期
         */
        public static int verifyToken(Claims claims) {
            if(claims==null){
                return 1;
            }
            try {
                claims.getExpiration()
                        .before(new Date());
                // 需要自动刷新TOKEN
                if((claims.getExpiration().getTime()-System.currentTimeMillis())>REFRESH_TIME*1000){
                    return -1;
                }else {
                    return 0;
                }
            } catch (ExpiredJwtException ex) {
                return 1;
            }catch (Exception e){
                return 2;
            }
        }
    
        /**
         * 由字符串生成加密key
         *
         * @return
         */
        public static SecretKey generalKey() {
            byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());
            SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
            return key;
        }
    
        public static void main(String[] args) {
           /* Map map = new HashMap();
            map.put("id","11");*/
            System.out.println(AppJwtUtil.getToken(1102L));
            Jws<Claims> jws = AppJwtUtil.getJws("eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQqEMAwA_5KzhURNt_qb1KZYQSi0wi6Lf9942NsMw3zh6AVW2DYmDGl2WabkZgreCaM6VXzhFBfJMcMARTqsxIG9Z888QLui3e3Tup5Pb81013KKmVzJTGo11nf9n8v4nMUaEY73DzTabjmDAAAA.4SuqQ42IGqCgBai6qd4RaVpVxTlZIWC826QA9kLvt9d-yVUw82gU47HDaSfOzgAcloZedYNNpUcd18Ne8vvjQA");
            Claims claims = jws.getBody();
            System.out.println(claims.get("id"));
    
        }
    }
    
    展开全文
  • 对明文密码加密和解密。

    一:加入包:

     

    二:test:

     

    展开全文
  • JS实现密码加密(base64, md5, sha1)

    热门讨论 2015-06-18 14:27:16
    JS实现密码加密(base64, md5, sha1)
  • 八成网站登录口令“裸身待缚” 电商类全军覆没,在用户口令传输过程中,仍然存在很多隐患。一般而言,用户在登录网站...而《报告》中显示,大部分样本网站在传输口令时,没有做加密处理,直接将明文密码向服务端传输。
  • Nacos忘记密码Nacos密码加密方式

    千次阅读 2021-08-05 12:37:29
    忘了Nacos控制台的登录密码,打开数据库...点进去看到,使用的是org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder#encode,为spring security包下的密码加密实现类。 Bcrypt加密算法 什么是Bcrypt加
  • RSA加密:Web前端登录账户密码加密传输

    万次阅读 多人点赞 2022-02-09 14:20:59
    在这种情况下,密码的明文传输显然是不合适的,因为请求如果在传输过程中被截了,就可以直接拿明文密码登录网站了。 为了传输数据的安全、今天就采用RSA加密方式来进行加密。 实现方式思路: 编写加解密公共方法...
  • SpringBoot 密码加密方式

    千次阅读 2020-06-02 17:50:01
    1.为什么要加密 2011 年 12 月 21 日,有人在网络上公开了一个包含 600 万个某网站用户资料的数据库,数据全部为明文储存,包含用户名、密码以及注册邮箱。事件发生后该网站在微博、官方网站等渠道发出了声明,解释...
  • web系统中常见的密码加密方式

    千次阅读 2020-02-04 16:32:37
    1 用户密码加密的必要性 web系统中通常都会有登录的功能,登录功能的逻辑是这样的:一个用户拥有一个用户名为zhangsan,密码为123456的账号,在登录时,前端去调用后端的登录接口,并传入zhangsan与123456作为参数...
  • node密码加密bcrypt

    千次阅读 2021-11-18 21:03:06
    用户的密码在数据库当中不能以明文的形式进行存储,需要进行加密处理 加密方法: 密码中混入一段“随机”的字符串再进行哈希加密,这个被字符串被称作盐值。 为什么要加盐:同一个密码经过哈希算法后得到的密码是...
  • 用户名密码加密传输

    千次阅读 2020-07-21 17:05:19
    最近修改一个项目,需要将用户名密码加密传输,记录一下做法,用到js的JSEncrypt,Java的bcprov-jdk15on。 具体步骤 添加maven依赖,下载jsencrypt.min.js文件并在登录页添加该js文件 <dependency> <...
  • 维吉尼亚密码加密--解密程序

    热门讨论 2013-10-24 19:24:06
    维吉尼亚密码加密--解密程序,可以帮您验证你写的算法是否正确
  • spring--密码加密

    千次阅读 2021-12-04 14:52:00
    密码加密 1.apache的common组件中的DigestUtils <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> <dependency> <groupId>commons-codec</groupId> <...
  • 如何在MySQL中给密码加密与解密

    千次阅读 2021-01-28 08:14:53
    如何在MySQL中给密码加密与解密发布时间:2020-04-17 10:18:41来源:亿速云阅读:308作者:小新如何在MySQL中给密码加密与解密?很多人都不太了解,今天小编为了让大家更加了解MySQL中给密码加密与解密的方法,所以...
  • SpringBoot配置文件数据库密码加密

    千次阅读 2020-05-22 13:57:11
    需求:springboot的配置文件中,把连接数据库的密码加密,使之不是以明文存储 步骤 导入Maven坐标 <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-...
  • BCrypt密码加密

    千次阅读 2021-11-15 10:16:16
    我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。BCrypt比MD5更安全,但加密更慢。 Spring Security 提供...
  • 密码加密(必须用密文储存密码)

    千次阅读 2022-02-08 18:04:45
    加密流程 密码不可逆算法,无法计算出明文。 配置方法 ...public class SecurityConfig { ... public PasswordEncoder ...此处注释的为密码加密器,加入{bcrypt}可以不配置 BCryptPasswordEncoder()为Spring提供好的..
  • nacos连接数据库密码加密

    千次阅读 2020-10-22 09:43:03
    nacos数据库密码加密简介修改源码打包发布 简介 nacos作为一款优秀的注册发现中心和配置管理工具,能够实现微服务配置的热更新,同时从代码中解耦出去,更加自由的控制服务的上线和下线,使所有的操作全部可视化,独立...
  • 集成druid实现数据库密码加密功能

    千次阅读 2021-03-12 21:48:01
    可以使用Druid为此提供一种数据库密码加密的手段ConfigFilter。 目录 1、执行命令加密数据库密码 2、配置数据源,提示Druid数据源需要对数据库密码进行解密 3、DruidProperties配置connectProperties属性 4、...
  • 密码加密几种处理方式

    千次阅读 2021-11-24 17:38:40
    1、首先介绍一下常规的登录认证(非安全性) 数据库表如下所示: ...(1)数据库密码以明文的...l 数据库密码加密后,校验的逻辑就发生了些变化,需要对提交的密码进行加密之后再做对比,但是这样子还是不安全。 (1)通
  • 08 SpringSecurity-密码加密

    千次阅读 2022-02-11 11:16:53
    Spring Security内置了密码加密机制,只需使用一个PasswordEncoder接口即可 public interface PasswordEncoder { String encode(CharSequence rawPassword); boolean matches(CharSequence rawPa
  • SpringSecurity--密码加密、方法安全

    千次阅读 2020-02-08 01:50:02
    密码加密 Spring Security提供了多种密码加密方案,官方推荐使用BCryptPasswordEncoder,BCryptPasswordEncoder使用BCrypt强哈希函数,开发者在使用时可以选择提供strength和SecureRandom实例。strength越大,密钥的...
  • redis设置密码加密

    千次阅读 2020-12-02 13:47:17
    映射或者禁止一些高危命令 后面为空即为禁止 rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL "" eg: rename-command FLUSHALL "VIPKIDDELETEALL" 为redis设置密码 添加 requirepass &...
  • SpringBoot整合BCrypt进行密码加密

    千次阅读 2021-11-25 18:15:53
    -- security依赖包 (加密) --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> </dependency> &
  • 恺撒密码加密与解密

    千次阅读 2021-04-05 23:20:01
    密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目...
  • MyBatis - 使用示例(四)SpringBoot配置数据库密码加密 前面三篇文章简单的示意了下MyBatis和Spring以及SpringBoot的整合。本文讲一下如何在SpringBoot下配置数据库密码加密。 一、借助Druid数据源配置数据库密码...
  • springboot druid数据库密码加密

    万次阅读 2019-07-23 15:19:21
    springboot druid数据库密码加密pom.xml引入jar生成加密密码配置数据库文件 pom.xml引入jar <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter&...
  • 可以说,密码加密存储是用户账户系统的底裤,它的重要性,相当于你独自出远门时缝在内衣里钱,虽然你用到他们的概率不大,但关键时刻他们能救命。 那用加密算法比如AES,把密码加密下再存,需要明文的时候我再解密。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 514,305
精华内容 205,722
关键字:

密码加密