当前位置: 首页 > news >正文

威海做网站的公司有哪些苏州网站推广优化

威海做网站的公司有哪些,苏州网站推广优化,网站建设预算及准备,网站域名证书怎么获取目录 为什么需要加密#xff1f; 密码算法分类 对称密码算法 非对称密码算法 摘要算法 DigestUtils MD5在线解密工具原理 实现用户密码加密 代码实现 为什么需要加密#xff1f; 在MySQL数据库中#xff0c;我们常常需要对用户密码、身份证号、手机号码等敏感信息进…目录 为什么需要加密 密码算法分类 对称密码算法 非对称密码算法 摘要算法 DigestUtils MD5在线解密工具原理 实现用户密码加密 代码实现 为什么需要加密 在MySQL数据库中我们常常需要对用户密码、身份证号、手机号码等敏感信息进行加密以保证数据的安全性。若我们直接使用明文存储这些敏感信息当黑客入侵数据库时就可以轻松拿到用户的相关信息从而造成信息泄露或财产损失 密码算法分类 密码算法主要分为三类对称密码算法、非对称密码算法和摘要算法 对称密码算法 对称密码算法对称密码算法使用相同的密钥来进行加密和解密。这意味着在加密和解密过程中都使用相同的密钥。对称密码算法通常比非对称密码算法更快速因为它们不涉及复杂的数学运算。 我们可以将加密的过程看做数学中计算 y f(x) 的过程其中 x 为明文y 为密文f( )表示不同的加密算法通过 f(x) 计算密文y 对于对称加密由于其在加密和解密过程中使用相同的密钥即 计算密文y f(x) 计算明文x f(y) 对称密码算法可以进一步分为两种类型块密码和流密码 块密码块密码将明文划分为固定大小的块并对每个块进行加密。常见的块密码算法有 DESData Encryption StandardDES是一种早期的对称加密算法使用56位密钥和64位分组大小。 3DESTriple DES3DES是对DES的改进使用两次或三次DES加密过程来增加密钥长度和安全性。它使用的密钥长度为56位但由于密钥被使用多次实际的密钥长度为112位或168位。 AESAdvanced Encryption StandardAES是目前广泛使用的对称加密算法其密钥长度可以是128位、192位或256位。AES具有较高的安全性和性能被广泛应用于各种加密场景。 流密码流密码将明文与密钥流进行按位异或运算来进行加密。密钥流可以是伪随机生成的也可以是基于密钥和其他参数的确定性生成的。常见的流密码算法有 RC4Rivest Cipher 4RC4是一种流密码算法曾经被广泛用于加密通信协议中如WEP和SSL/TLS。 Salsa20 和 ChaCha20Salsa20和ChaCha20是由丹尼尔·J·伯恩斯坦Daniel J. Bernstein设计的流密码算法被广泛认为是高性能和安全的加密算法被用于加密通信和随机数生成等领域。 非对称密码算法 非对称密码算法非对称密码算法使用一对密钥即公钥和私钥来进行加密和解密。这意味着使用公钥对数据进行加密后只有持有相应私钥的实体才能解密数据。非对称密码算法也被称为公钥密码算法相对于对称密码算法来说它提供了更好的密钥管理和安全性。 同样的我们将加密的过程看做数学中计算 y f(x) 的过程 而对于非对称加密其使用用户公钥进行加密私钥进行解密即 计算密文y f(x) 计算明文x m(y) 其中 x 为明文y 为密文f( )表示加密算法也可看做公钥通过 f(x) 计算密文ym( )表示解密算法也可看做私钥通过m(y)计算明文 常见的非对称密码算法有 RSARivest-Shamir-AdlemanRSA是一种基于大整数的非对称加密算法广泛应用于安全通信、数字签名等领域。RSA算法的安全性基于大整数分解的困难性即在已知公钥的情况下无法有效地分解出私钥。 DSADigital Signature AlgorithmDSA是一种用于数字签名的非对称加密算法主要用于确保数字信息的完整性和真实性。DSA算法与SHA-1或SHA-2哈希函数结合使用以生成数字签名。 ECCElliptic Curve CryptographyECC是一种基于椭圆曲线离散对数问题的加密算法它提供了与RSA相当的安全性但使用更短的密钥长度从而降低了计算和存储成本。 摘要算法 摘要算法摘要算法也称为哈希函数是一种将任意长度的输入消息转换为固定长度的输出值哈希值的算法。 同样的我们将加密的过程看做数学中计算 y f(x) 的过程其中 x 为明文y 为密文f( )表示加密算法 对于摘要算法可以通过y f(x)计算密文而无法通过密文计算明文 摘要算法具有以下特性 固定长度输出摘要算法生成的哈希值长度是固定的不受输入消息长度的影响。 唯一性对于不同的输入消息摘要算法应该生成不同的哈希值。理想情况下不同的输入应该产生唯一的哈希值但由于输出空间有限可能存在碰撞多个不同的输入生成相同的哈希值。 不可逆性从哈希值推导原始输入消息应该是困难的即使在已知哈希值的情况下也应该难以确定原始输入消息。 抗碰撞性摘要算法应该具有良好的抗碰撞性即在计算上难以找到两个不同的输入消息产生相同的哈希值。 常见的摘要算法有 MD5Message Digest Algorithm 5是一种广泛使用的哈希函数用于产生128位16字节的哈希值。MD5算法主要用于对消息进行一致性校验、数据完整性验证等非加密目的。 SHA-1Secure Hash Algorithm 1SHA-1是一种被广泛使用的摘要算法但由于其存在碰撞攻击逐渐被淘汰。 SHA-256、SHA-384、SHA-512这些是SHA-2家族的一部分它们分别生成256位、384位和512位长度的哈希值。SHA-2算法提供了更高的安全性被广泛应用于各种加密应用中。 SHA-3Secure Hash Algorithm 3SHA-3是NIST选出的新一代哈希算法标准其设计目标是提供与SHA-2不同的算法选择以增加算法多样性。 DigestUtils DigestUtils 是Spring为我们提供的一个MD5加密工具类用于生成MD5哈希值进行消息摘要的计算我们可以直接利用该工具类中的方法来对数据进行加密 其中常用的方法有 byte[] md5Digest(byte[] bytes)计算给定字节数组的MD5哈希值 byte[] md5Digest(InputStream inputStream)计算给定输入流的MD5哈希值 String md5DigestAsHex(byte[] bytes)计算给定字节数组的MD5哈希值并以十六进制字符串形式返回结果 String md5DigestAsHex(InputStream inputStream)计算给定输入流的MD5哈希值并以十六进制字符串形式返回结果 StringBuilder appendMd5DigestAsHex(byte[] bytes, StringBuilder builder)计算给定字节数组的MD5哈希值并将其以十六进制字符串形式添加到给定的StringBuilder StringBuilder appendMd5DigestAsHex(InputStream inputStream, StringBuilder builder)计算给定输入流的MD5哈希值并将其以十六进制字符串形式添加到给定的StringBuilder 我们以对用户密码进行加密为例来进一步学习DigestUtils import org.springframework.util.DigestUtils;public class MD5UtilsTest {public static void main(String[] args) {String password1 DigestUtils.md5DigestAsHex(123456.getBytes());System.out.println(123456: password1);String password2 DigestUtils.md5DigestAsHex(123456.getBytes());System.out.println(123456: password2);String password3 DigestUtils.md5DigestAsHex(123457.getBytes());System.out.println(123457: password3);String password4 DigestUtils.md5DigestAsHex(12345.getBytes());System.out.println(12345: password4);} } 运行结果 我们可以看到对于相同的输入生成相同的哈希值而不同的输入生成不同的哈希值且 “123456” 和 “123457” 只有一个字符不相同但生成的哈希值差别却很大生成的哈希值长度是固定的不受输入消息长度的影响 MD5在线解密工具原理 MD5是一种摘要算法摘要算法具有不可逆性那么网上的MD5在线解密工具是如何解密的呢 这是因为其会将常用的字符串的MD5哈希值保存到数据库中当用户输入一个MD5哈希值时就会尝试找到对应的明文若找到对应的哈希值与明文的映射则返回该明文作为解密结果若没有找到对应映射则可能会放弃解密这是因为实时计算MD5哈希值对应的明文需要消耗大量的计算资源尤其是对应复杂的密码或长文本 我们随便找一个在线解密工具网站 输入之前 “123456”的哈希值进行解密 对应较为简单的 123456则很快得出结果 而当我们输入较为复杂的明文进行加密 此时再尝试进行解密 则会解密失败 实现用户密码加密 我们通过MD5算法对用户密码进行加密但由于其不可逆性我们该如何进行判断用户输入的密码是否正确呢 虽然经过MD5加密后的密文无法解密但由于相同的密码经过MD5哈希后得到的密文是相同的我们可以利用这个特性对密码进行验证 计算用户输入的密码的哈希值并将其与数据库中存储的哈希值相比较若相同则用户输入的密码正确若不同则用户输入的密码错误 即采用 判断哈希值是否一致 的方法来判断密码是否正确 但是正是由于相同的密码经过MD5哈希后的密文是相同的当存储用户密码的数据库泄露后攻击者很容易找到相同密码的用户从而降低了破解密码的难度且用户输入的密码可能为弱密码如 123456、666666等此时破解密码的难度也较低。 因此我们在对用户密码进行加密时需要考虑对密码进行包装即使是相同的密码也保存为不同的密文即用户即使是输入的弱密码也对其进行增强从而增加密码被攻破的难度 那么应该如何实现呢 我们可以为密码拼接一个复杂字符后进行加密为了进一步提供安全性我们可以拼接一个随机复杂字符串这个随机复杂字符串我们称之为 “盐” 这样当黑客通过一定手段拿到这个加密串时拿到明文并不是我们加密前的字符串而是加密前的字符串和盐组合的字符串这样相对来说又增加了字符串的安全性 因此用户密码加密实现为 如何生成随机盐值呢 我们可以使用 UUID 生成随机盐值 UUIDUniversally Unique Identifier是一种标准化的格式用于表示全局唯一的标识符。UUID通常以32位的十六进制数字表示由五段组成以连字符分隔例如550e8400-e29b-41d4-a716-446655440000。 我们可以通过randomUUID()方法来生成唯一识别码 import java.util.UUID;public class MD5UtilsTest {public static void main(String[] args) {System.out.println(UUID.randomUUID());System.out.println(UUID.randomUUID());System.out.println(UUID.randomUUID());} } 运行结果 我们可以将其结果转换为字符串并去掉其中的 “-” import java.util.UUID;public class MD5UtilsTest {public static void main(String[] args) {System.out.println(UUID.randomUUID().toString().replace(-, ));} } 此时我们就可以得到 32位 随机盐值 此时我们将密码和随机盐值一起进行MD5哈希 import org.springframework.util.DigestUtils; import java.util.UUID;public class MD5UtilsTest {public static void main(String[] args) {String password1 DigestUtils.md5DigestAsHex((123456 UUID.randomUUID().toString().replace(-, )).getBytes());System.out.println(123456: password1);String password2 DigestUtils.md5DigestAsHex((123456 UUID.randomUUID().toString().replace(-, )).getBytes());System.out.println(123456: password2);} } 运行结果 此时即使是相同的密码加密后生成的哈希值也是不同的 由于我们通过 判断哈希值是否一致 的方法来判断密码是否正确因此在用户登录输入密码时我们需要拿到 用户注册时生成的随机盐值因此我们需要在数据库中存储 盐值 和 密文即 盐值 MD5明文 盐值 在存储盐值和密文时我们可以存储 盐值 密文 密文 盐值 4位盐值 4位密文 4位盐值 4位密文 ... 4位密文 4位盐值  4位密文  4位盐值  ... ...... 有多种存储方式同样我们在拼接明文和盐值时也有多种拼接方式 在学习了如何实现用户密码加密后我们来通过代码实现 加密 和 验证 代码实现 我们首先来实现加密 1. 生成随机盐值 2. 对 明文 随机盐值进行MD5加密 /*** 对用户注册密码进行加密* param password 用户注册密码* return 数据库中存储信息(盐值 密文)*/public static String encipher(String password) {// 生成盐值String salt UUID.randomUUID().toString().replace(-, );//将盐值 明文进行加密String secretPassword DigestUtils.md5DigestAsHex((salt password).getBytes());return salt secretPassword;} 接下来我们实现验证 1. 校验输入的密码是否有效 2. 校验数据库中存储的密码是否有效 3. 获取盐值 4. 根据用户登录输入的密码和盐值进行加密生成哈希值 5. 比较生成的哈希值和数据库中存储的密文是否相同 /*** 验证密码是否正确* param inputPassword 用户登录时输入的密码* param sqlPassword 数据库中存储的密码(盐值 密文)* return 密码是否正确*/public static Boolean verify(String inputPassword, String sqlPassword) {//校验if(!StringUtils.hasLength(inputPassword)) {return false;}if(!StringUtils.hasLength(sqlPassword) || sqlPassword.length() ! 64) {return false;}// 解析盐值String salt sqlPassword.substring(0, 32);// 生成哈希值String secretPassword DigestUtils.md5DigestAsHex((salt inputPassword).getBytes());//判断是否相同return sqlPassword.equals(salt secretPassword);} 除了使用 MD5进行加密我们也可以使用 AES、RSA等加密算法或自己实现加密算法进行加密
http://www.w-s-a.com/news/581694/

相关文章:

  • 做网站 还是淘宝店wordpress分类链接后加
  • wordpress腾讯云 COSseo内容优化心得
  • 特价旅游机票网站建设i营销
  • 如何成立网站深圳创业项目
  • 建设商业网站惠州网站建设推荐乐云seo
  • 如何申请免费域名做网站免费推广神器
  • 自媒体人专用网站安岳网站建设
  • 特乐网站建设做网站推广要多少钱
  • 山东省建设安全生产协会网站义乌跨境电商公司前十名
  • 做网站优化就是发文章吗起飞页自助建站平台的特点
  • 做网站还是做app好慈溪机械加工网
  • 上传下载文件网站开发的php源码腾讯企点
  • 给分管领导网站建设情况汇报怎么写网络运营的岗位职责及任职要求
  • 电线电缆技术支持中山网站建设广告设计培训学校有哪些
  • 如何禁止通过ip访问网站wordpress无法调用主题布局和图片
  • 江西建设工程信息网站重庆网站推广大全
  • 南浔区住房城乡建设局网站网页设计基础学什么
  • 萧山做网站的企业网站建设 西安
  • 江西省城乡建设厅网站百度站长资源平台
  • 本地搭建linux服务器做网站免费查企业信息查询
  • 电商网站建设与运营网上购物哪个网站最好
  • 做app做网站从何学起网站设计需要什么证
  • 设计网站最重要的是要有良好的短网址还原
  • 大连建设银行招聘网站做seo是要先有网站吗
  • 中山做网站的wordpress建站教程百科
  • 湛江专业网站制作做网站需要工具
  • 做音箱木工网站吉林平安建设网站
  • 品牌网站建设咨询灯光设计网站推荐
  • 温州网站运营打开百度一下网页版
  • 网站有情链接怎么做住房公积金个体工商户