精华内容
下载资源
问答
  • 区别:MD5加密:加密时通过原字符串加密成另一串字符串解密时需要原加密字符串进行重新...RSA加密略比MD5加密牛逼一点点但凡事都有好坏 MD5加密执行效率比RSA快废话不多说上栗子:MD5加密:package cn.news.util;im...

    区别:

    MD5加密:

    加密时通过原字符串加密成另一串字符串

    解密时需要原加密字符串进行重新加密比较两次加密结果是否一致

    T=RSA加密:

    加密时通过原字符串生成密钥对(公钥+私钥)

    解密时通过公钥和私钥进行解密,解密出原字符串进行比较是否一致

    个人观点:

    RSA加密略比MD5加密牛逼一点点

    但凡事都有好坏    MD5加密执行效率比RSA快

    废话不多说上栗子:

    MD5加密:

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    package cn.news.util;

    import java.security.MessageDigest;

    /**

    *

    * @author: 房上的猫

    *

    * @time: 2018年5月14日 下午8:04:44

    *

    * @博客地址: https://www.cnblogs.com/lsy131479/

    *

    */

    public class MD5 {

    private static String MD(String s) {

    try {

    MessageDigest md = MessageDigest.getInstance("MD5");

    md.update(s.getBytes("utf-8"));

    byte[] bytes = md.digest(s.getBytes("utf-8"));

    return toHex(bytes);

    } catch (Exception e) {

    throw new RuntimeException(e);

    }

    }

    private static String toHex(byte[] bytes) {

    final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();

    StringBuilder ret = new StringBuilder(bytes.length * 2);

    for (int i = 0; i < bytes.length; i++) {

    ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);

    ret.append(HEX_DIGITS[bytes[i] & 0x0f]);

    }

    return ret.toString();

    }

    public static void main(String[] args) {

    System.out.println(MD("hello word"));

    }

    }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    结果:

    eb8e93b9d699265ef2dd6376894204b4.png

    RSA加密与解密:

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    package cn.news.util;

    import java.security.KeyPair;

    import java.security.KeyPairGenerator;

    import java.security.PrivateKey;

    import java.security.PublicKey;

    import java.util.Base64;

    import javax.crypto.Cipher;

    /**

    *

    * @author: 房上的猫

    *

    * @time: 2018年5月14日 下午7:56:12

    *

    * @博客地址: https://www.cnblogs.com/lsy131479/

    *

    */

    public class RSA {

    public static String data = "hello world";

    public static void main(String[] args) throws Exception {

    // TODO Auto-generated method stub

    KeyPair keyPair = genKeyPair(1024);

    // 获取公钥,并以base64格式打印出来

    PublicKey publicKey = keyPair.getPublic();

    System.out.println("公钥:" + new String(Base64.getEncoder().encode(publicKey.getEncoded())));

    // 获取私钥,并以base64格式打印出来

    PrivateKey privateKey = keyPair.getPrivate();

    System.out.println("私钥:" + new String(Base64.getEncoder().encode(privateKey.getEncoded())));

    // 公钥加密

    byte[] encryptedBytes = encrypt(data.getBytes(), publicKey);

    System.out.println("加密后:" + new String(encryptedBytes));

    // 私钥解密

    byte[] decryptedBytes = decrypt(encryptedBytes, privateKey);

    System.out.println("解密后:" + new String(decryptedBytes));

    }

    // 生成密钥对

    public static KeyPair genKeyPair(int keyLength) throws Exception {

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

    keyPairGenerator.initialize(1024);

    return keyPairGenerator.generateKeyPair();

    }

    // 公钥加密

    public static byte[] encrypt(byte[] content, PublicKey publicKey) throws Exception {

    Cipher cipher = Cipher.getInstance("RSA");// java默认"RSA"="RSA/ECB/PKCS1Padding"

    cipher.init(Cipher.ENCRYPT_MODE, publicKey);

    return cipher.doFinal(content);

    }

    // 私钥解密

    public static byte[] decrypt(byte[] content, PrivateKey privateKey) throws Exception {

    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.DECRYPT_MODE, privateKey);

    return cipher.doFinal(content);

    }

    }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    运行结果:

    7271d9033afcb859fa21d8ddbf2f83b0.png

    展开全文
  • 作者l 全栈测试笔记在使用jmeter做测试的过程中,经常需要对请求的入参进行加密,下面列举几种常用的方法,以登录请求密码需要MD5加密为例。虽然可以先把参数化的明文密码都先md5加密,而不是在登录前先执行加密,...

    65ec5d48faac545a4c6e794ad3089a73.gif

    作者 l 全栈测试笔记

    在使用jmeter做测试的过程中,经常需要对请求的入参进行加密,下面列举几种常用的方法,以登录请求密码需要MD5加密为例。

    虽然可以先把参数化的明文密码都先md5加密,而不是在登录前先执行加密,但是实际情况是,登录后的请求也可能有需要加密的入参,且入参是动态获取的,所以最好是在脚本运行过程中加密,而不是提前加密好进行参数化。

    如果用户的密码都不一样,就需要先对明文密码进行参数化。下面只演示单个用户请求。

    一、jmeter自带函数

    在函数助手中找到__MD5这个函数,第一个参数是要md5加密的值,第二个参数是保存加密后值的变量deab9f0d966c91cb134e0344ddb10efd.png请求ba4ec6dec430020e9d634f516877f834.png发送请求,可以看到密码加密了e9a910656f54044bbca2c1816869546b.png

    二、beanshell自定义脚本

    细心的朋友会发现,不是每个jmeter版本都有${__MD5(,)}这个函数,在jmeter的lib目录下,自带commons-codec-1.11.jar,如果没有,可以到maven库下一个,下载地址:

    https://mvnrepository.com/

    然后放到jmeter的lib目录下,所以,可以借助apache工具类DigestUtils实现。

    beanshell脚本394e3f8227f4ce944bb74b22087441b3.png

    解释:

        第一行:导包

        第二行:加密

        第三行:将加密后的值放到变量中

    b0447c694cc82f878edff4865a83fb95.png引用变量e50559ac1bda2788e0260e38506995ad.png发送请求,可以看到密码加密了aa3b818f503e3d99667adcc5eb3bd225.png也可以用beanshell前置处理器,结果是一样的7528b4549c66987255cf51f01b5e239e.png

    三、引用外部java文件

    这里我们还是用上一种方法用到的jar包。

    pom中添加依赖

    ae1a31295b4a29e78a7504d255baa578.png编写java代码  61cedd6a41ed9510e420b56f862335fe.pngbeanshell引入java文件、调用加密方法、把加密后的值放到变量中,注意:路径最好参数化,不要写死4d2b75acd7a42f2d3c6600f8476d179c.png引用变量6bbd9ffb07b9f4993b3fd1df1b49cd93.png发送请求,可以看到密码加密了3e35b0f59473c9aab2e50502b31f9e0f.png

    四、引用外部class文件

    引用class文件的方式,和引用java文件类似,沿用上一方法创建的maven工程,项目运行后,在左侧会生成target目录,在这个目录下,可以看到我们的包名及生成的class文件,我们需要引用这个文件

    21e7ed092aff38613d80eccd66494ae8.png

    beanshell中引入类文件注意:类文件路径不能包含包名对应的目录路径,否则会报错。添加com的父级目录路径即可。注意:路径最好参数化,不要写死4f0fa868f84928318428748d13ae656b.png也可以这样写dcf276aac23619767b72ffb072b5e351.png引用变量6bbd9ffb07b9f4993b3fd1df1b49cd93.png发送请求,可以看到密码加密了aabef3bfa479b113d96687f5b9d806b2.png

    五、引用外部jar文件

    如果在beanshell中写复杂的逻辑代码,出错了,定位很不方便,所以,如果代码逻辑复杂,建议在idea或者eclipse中写好,然后mvn package打包,生成的target目录下,会有一个jar包,把生成的jar包复制到lib下ext中引入jar包,重启jmeter。

    这样我们只需要在beanshell中写很少的脚本,这也是5种方式中我极力推荐使用的方式。

    继续沿用之前创建的maven项目(我们可以在idea中写比较复杂的代码,这里只是演示,所以只是很简单的代码)

    c1e777445dc63a178b48f7c6db4404c4.png

    类名+静态方法

    807df75c52ed6fec6d70cc30c582c1d1.png实例+静态方法a50ef6bc64577112ac22767dc3c3c1b4.png引用变量1b5357d8d7be5e77c1c0053126d4e5c3.png发送请求,可以看到密码加密了 884faccec10b4b0f836864369899592e.png也可以用beanshell前置处理器 839ab07c2c68d5feec1a4ec712ab7033.png

    至此,五种方法都介绍完了,一定要亲自实践哦,这样才会有收获。

    声明:封面或正文部分图片来源于网络,如有侵权,请联系删除。

    END

    抛砖引玉,欢迎交流;

    水平有限,难免有错,欢迎斧正。

    欢迎长按下图联系作者

    9a9724631052819bcaf254cca6fb6942.png

    834d8d5ca062c7caa983eff063ee2e21.gif

    欢迎长按下图关注全栈测试笔记

    3a714fbf8766fd112cf64fe9a9972b68.png

    推荐阅读

    点击阅读☞如何面试性能测试

    点击阅读☞面试题(造火箭必备技能):请举例一个最有成就感的性能bug

    点击阅读☞jmeter5.1分布式压

    点击阅读☞性能测试案例:redis获取不到连接池,Timeout waiting for idle object

    点击阅读☞性能测试案例:tps波动频繁

    点击阅读☞性能测试案例:一个频繁fgc问题

    点击阅读☞性能测试案例:获取不到redis连接池

    点击阅读☞性能测试案例:数据库cpu高导致响应时间长

    如有帮助,请帮忙转发或点个在看~947845d19db3e061ad01b93a39682510.gif

    展开全文
  • asp.net 及 asp.net core 下 MD5加密建议使用MD5Hash及其重载这两个方法,字符串加密时效率很高 建议使用MD5Hash及其重载这两个方法,字符串加密时效率很高 using System; using System.Collections.Generic; using ...

    建议使用MD5Hash及其重载这两个方法,字符串加密时效率很高

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace System
    {
        public class MD5Helper
        {
            public static string PasswordSalt
            {
                get { return "landic"; }
            }
            /// <summary>
            /// 获取文件MD5摘要
            /// </summary>
            /// <param name="fileName"></param>
            /// <returns></returns>
            public static string AbstractFile(string fileName)
            {
                using (FileStream file = new FileStream(fileName, FileMode.Open))
                {
                    return AbstractFile(file);
                }
            }
    
            /// <summary>
            /// 根据stream获取文件MD5摘要
            /// </summary>
            /// <param name="stream"></param>
            /// <returns></returns>
            public static string AbstractFile(Stream stream)
            {
                MD5 md5 = new MD5CryptoServiceProvider();
                byte[] retVal = md5.ComputeHash(stream);
    
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < retVal.Length; i++)
                {
                    sb.Append(retVal[i].ToString("x2"));
                }
                return sb.ToString();
            }
            public static string MD5Hash(string input)
            {
                using (var md5 = MD5.Create())
                {
                    var value = md5.ComputeHash(Encoding.ASCII.GetBytes(input));
                    var result = BitConverter.ToString(value);
                    return result.Replace("-", "");
                }
            }
            public static string MD5Hash(Stream inputStream)
            {
                using (var md5 = MD5.Create())
                {
                    var value = md5.ComputeHash(inputStream);
                    var result = BitConverter.ToString(value);
                    return result.Replace("-", "");
                }
            }
            public static string Encrypt(string source, int length = 32)//默认参数
            {
                if (string.IsNullOrEmpty(source)) return string.Empty;
                HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
                byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的
                byte[] hashValue = provider.ComputeHash(bytes);
                StringBuilder sb = new StringBuilder();
                switch (length)
                {
                    case 16://16位密文是32位密文的9到24位字符
                        for (int i = 4; i < 12; i++)
                        {
                            sb.Append(hashValue[i].ToString("x2"));
                        }
                        break;
                    case 32:
                        for (int i = 0; i < 16; i++)
                        {
                            sb.Append(hashValue[i].ToString("x2"));
                        }
                        break;
                    default:
                        for (int i = 0; i < hashValue.Length; i++)
                        {
                            sb.Append(hashValue[i].ToString("x2"));
                        }
                        break;
                }
                return sb.ToString();
            }
    
            public static string GetPassword(string password)
            {
                var res = Encrypt(password + PasswordSalt);
                return res;
            }
        }
    }
    
    
    展开全文
  • MD5加密程序(原创)

    2009-10-26 19:32:56
    我自己写的一个MD5加密程序,代码较简单,功能还算可以,不过效率较低,需要支持_int64的编译环境
  • 一个好的数据库加密系统,应该在保证数据安全的基础上,尽可能的提高工作效率,在工作效率和安全性之间取得一个平衡。总体来说满足以下条件: 加解密速度要求足够快,这样能够减少影响数据操作响应时间。 加密强度...

           数据库加密系统是一款基于透明加密技术的数据库防泄漏系统,该产品能够对数据库中的敏感数据加密存储,访问控制增强,应用访问安全,安全审计以及三权分立等功能。

    一个好的数据库加密系统,应该在保证数据安全的基础上,尽可能的提高工作效率,在工作效率和安全性之间取得一个平衡。总体来说满足以下条件:

    • 加解密速度要求足够快,这样能够减少影响数据操作响应时间。
    • 加密强度足够大,保证大部分数据长时间不被破译。但是在实际应用中加密算法不一定在理论上无法破解,但在实际应用中应能保证破解密文的代价大于获取其中数据的意义。
    • 对数据库的合法用户来说加解密操作是透明的,他不会影响用户的合理操作。换句话说,若某用户在明文数据库系统中能够进行更新,增加,删除数据,那么在密文数据库中也可以用相同的方法增加,更新和删除数据,用户不关心数据如何完成加解密。
    • 加密后的数据库,存储量不能有较大程度的增加。
    • 密钥管理方案灵活,高效,密钥安全存储,使用方便可靠。众所周知,加密算法本身并不保密,所以要确保数据的安全性通常取决于密钥的安全性。

    数据库加密的主要方法:

    (1)MD5加密算法

    ​       在现阶段,我们一般认为存在两种加密方式,单向加密和双向加密。双向加密是加密算法中最常用的,它将我们可以直接理解的明文数据加密为我们不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文。双向加密适合于隐秘通讯,比如,我们在网上购物的时候,需要向网站提交信用卡密码,我们当然不希望我们的数据直接在网上明文传送,因为这样很可能被别的用户“偷听”,我们希望我们的信用卡密码是通过加密以后,再在网络传送,这样,网站接受到我们的数据以后,通过解密算法就可以得到准确的信用卡账号。

            单向加密刚好相反,只能对数据进行加密,也就是说,没有办法对加密以后的数据进行解密。可能我们立即就会想,这样的加密有什么用处?不能解密的加密算法有什么作用呢?在实际中的一个应用就是数据库中的用户信息加密,当用户创建一个新的账号或者密码,他的信息不是直接保存到数据库,而是经过一次加密以后再保存,这样,即使这些信息被泄露,也不能立即理解这些信息的真正含义。

           MD5就是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。前者的意思是不可能有任意两段明文加密以后得到相同的密文,后者的意思是如果我们加密特定的数据,得到的密文一定是相同的。

            MD5CyptoServiceProvider类是.NET中System.Security.Cryptography名字空间的一个类,提供专门用于MD5单向数据加密的解决方法,也是本文中我们用来加密数据库中密码的类。在真正进行数据加密之前,我们首先来了解MD5CyptoServiceProvider类中的主要方法:ComputeHash,它将输入的明文数据数组使用MD5加密以后输出加密后的密文数据数组。

    使用加密方式保存到数据库的限制:

    ​        在决定是否使用加密方式保存密码之前,我们还要考虑一些问题,因为MD5是单次加密算法,加密以后的信息不可以解密,所以,如果用户丢失密码,任何人都很难找到用户原来的密码,这时候,网站也就相应的失去一个很重要的功能,那就是用户提供其他信息来取得忘记的密码的功能,这不能不说是网站的一个大缺陷。另外,采用这样的加密方式,必须完全修改以前的用户资料,要求用户完全重新注册,这也是这种方法比较困难的一个地方。

    (2)密码加密:哈希加盐

    一般系统数据库密码加密方式:

    • MD5后存入数据库
    • SHA1 Hash后存入数据库

    缺点:黑客可以通过密码暴力破解获取密码信息,具体做法是将常用密码进行Hash后做成一个字典,破解的时候,只需要查字典就能知道对应的明文密码。

    建议:使用以下两种密码策略相结合的方式去解决

    • 密码 + 盐(一串随机数) 再Hash
    • 限制密码最小长度和密码复杂度

    解释:以上给每个密码加一个随机数后,实际上是将密码人为地拓展了N位,导致密码长度大增,使得攻击者很难很难构造这么大的一个字典去破解。退一步讲,就算攻击者的字典足够强大但是暴力破解所需要花费的时间代价过长从而降低了这种风险。

    // 1.指定加密算法
    MessageDigest digest = MessageDigest.getInstance("MD5");
    // 2.将需要加密的字符串转化成byte类型的数据,然后进行哈希过程
    byte[] bs = digest.digest((psd + salt).getBytes());
    // 3.遍历bs,让其生成32位字符串,固定写法
    
    展开全文
  • MD5加密类详细写法

    2008-10-05 17:03:50
    getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串 返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的. */ public String getMD5ofStr(String inbuf) { md5Init(); ...
  • MD5加密实现版本控制效果如何?

    千次阅读 2014-01-21 17:36:01
    看一个文件是否有更新,可以使用md5来获取MD5码,以此来...但是,对于大文件来说,md5加密大文件,获取的时间是比较长的,效率也降低了不少。 因此,解决办法是File 类的lastModified方法   private String getHash(S
  • 小议MD5加密字符串的防破解技术

    千次阅读 2014-04-13 15:22:15
    md5无疑是这个时代人们所最为津津乐道,最为常用的一项加密算法,其以加密强度颇大而著称,理论上通过穷举碰撞来猜解密文,得出原文,需要很强悍的计算机昼夜不停的工作N久才能完成,所以MD5算法的使用范围极为广泛~...
  • MD5动态加盐加密

    2020-10-23 15:16:45
    由于MD5解密网站的存在,普通的md5加密可能被破解 利用random函数动态生成slat盐进行加密。 突然写工具类是因为单位给的md5加密工具能加密的量太少了,千把条数据就卡死 自己写的类一两秒就六七万条加密完成了,...
  • MD5Code加密技术

    2013-01-24 13:18:36
    public class MD5Code { static final int S11 = 7; static final int S12 = 12; static final int S13 = 17; static final int S14 = 22; static final int S21 = 5; static final int S22 = 9; ...
  • 最近公司的接口都是MD5 16位加密,所以要使用加密功能。 之前也做过加密,因为用的比较少,所以是写了一个加密方法,导出JAR包,调用的。用起来需要很多设置,并且换算效率也不高。听前同事说,jmeter可以自己写...
  • 3、提高代码的运行效率。 es6 export default { } const http=require(“http”);// http模块 1、导出 module.exports 2、引入 require();// 总结: 模块化:按需加载 相互依赖 // 引入(...
  • 使用aes加密算法进行加密解密,实际运用时,可使用加密加密比对,安全性高,效率快。...因为md5算法是不可逆的:对加密结果不能进行解密。任意长度的数据,算出的md5值长度都是固定的。部分参考uikoo9博客内容
  • 加密算法,增加写代码的效率。很强的算法。。。。。。。。
  • 对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。 对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢
  • 用于账号注册,登陆时,密码进行加密,保护用户细心安全。 引入工具类,进行使用,提高代码的效率。 资源占用空间下。
  • 本次课题是:在白皮书中,HSN使用的其中一个关键核心技术称为“加密去重”,它的作用是什么?其原理又是如何的?1 去重技术的意义 在数据存储领域,去重技术是文件系统领域一项非常重要的技术,可以大大提高存储空间...
  • Android加密和解密(DES,AES,MD5

    万次阅读 2016-10-13 21:53:44
    加密算法有很多种,一般可以分为对称加密(如DES、AES等)、非对称加密(如RSA等)和单向加密(如MD5等)3类算法。 1)在对称加密算法中,双方使用的密钥相同,要求解密方事先必须知道加密密钥。这类加密算法技术...
  • 现有一OA系统,员工登录OA时,须使用其合法账号登录之,但这样一来,至少需要两个独立账号和密码,对工作效率有一定的影响。 于是我们决定改造现有的OA系统登录机制,使其与extmail使用一致的账号及密码信息,这样...
  • 常用加密方式DES、3DES、AES、MD5

    千次阅读 2018-06-19 11:45:46
    最近需要用到加密这块,然后...处理速度慢、密钥计算时间长、加密效率不高 。AES:高级数据加密标准,能够有效抵御已知的针对DES算法的所有攻击 。密钥建立时间短、灵敏性好、内存需求低、安全性高 。具体实现:生...
  • base64加密和解密是依赖于jdk自带的jar包3.md5和sha256是不可逆的,md5加密效率较快,sha256加密安全较高public class TestEncode {//异或实现加密解密public static String xor(String input){char[] chs = inp...
  • 现有一OA系统,员工登录OA时,须使用其合法账号登录之,但这样一来,至少需要两个独立账号和密码,对工作效率有一定的影响。 于是我们决定改造现有的OA系统登录机制,使其与extmail使用一致的账号及密码信息...
  • java的加密解密

    2019-09-25 09:30:29
    1. 使用md5和sha256必须导入commons-codec-1.9.jar包 ...3.md5和sha256是不可逆的,md5加密效率较快,sha256加密安全较高 public class TestEncode { //异或实现加密解密 public static String xor(String inpu...
  • MD5

    2021-02-26 15:56:14
    ​ 他的特点是算法公开、计算量少、加密速度快,对于同样大小的传输对象,对称加密效率通常为非对称加密的千倍左右,因此通常被广泛应; ​ 用于很多加密协议的核心工作(如https在 真正数据通信时就使用的对称加密...
  • 接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网络传输过程中,很有可能会导致密钥外泄。...
  • 最近使用到了加密算法,仔细对比了几种加密算法的效率以及实现方法。 我们选择了一个差不多1G大小的system.img来分别计算下这四种不同的摘要信息,我们写了一个脚本来计算,更方便我们...md5sum system.img date -...
  • 1、算法概述数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash...
  • 0x00 前言1、算法逆向分析android so的时候,总会遇到一些算法,掌握算法的识别特征对逆向工作效率提升很大,小伙伴给我发来一道android题,涉及几...最后一次MD5前的输入为:0x6b,0x93,0x9c,0xfa,0xeb,0x68,0x4b,0x...
  • MD5破解工具

    2012-05-14 20:43:11
    一款叹为观之的MD5加密暴力破解了,其破解效率高达百分之六十以上

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 245
精华内容 98
关键字:

md5加密效率