首页 > 其他分享 >写一个加密字符串的方法

写一个加密字符串的方法

时间:2024-11-21 12:07:57浏览次数:1  
标签:加密 iv 密钥 key 字符串 const CryptoJS 方法

/**
 * 加密字符串
 * @param {string} str 需要加密的字符串
 * @param {string} key 加密密钥
 * @returns {string} 加密后的字符串
 */
function encryptString(str, key) {
  if (!str) {
    return "";
  }

  try {
    // 使用 CryptoJS 库进行 AES 加密
    const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
    const iv = CryptoJS.enc.Utf8.parse(key.substring(0, 16)); // 使用 key 的前 16 个字符作为 iv
    const encrypted = CryptoJS.AES.encrypt(str, keyUtf8, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    });

    // 将加密结果转换为 Base64 编码
    return encrypted.toString();
  } catch (error) {
    console.error("加密失败:", error);
    return "";
  }
}


/**
 * 解密字符串
 * @param {string} encryptedStr 加密后的字符串
 * @param {string} key 解密密钥
 * @returns {string} 解密后的字符串
 */
function decryptString(encryptedStr, key) {
  if (!encryptedStr) {
    return "";
  }

  try {
    const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
    const iv = CryptoJS.enc.Utf8.parse(key.substring(0, 16)); // 使用 key 的前 16 个字符作为 iv

    const decrypted = CryptoJS.AES.decrypt(encryptedStr, keyUtf8, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    });

    // 将解密结果转换为 UTF-8 编码
    return decrypted.toString(CryptoJS.enc.Utf8);
  } catch (error) {
    console.error("解密失败:", error);
    return "";
  }
}



// 使用示例:
const key = "YourSecretKey12345"; //  密钥长度建议至少 16 位
const originalString = "This is a secret message.";

const encryptedString = encryptString(originalString, key);
console.log("Encrypted:", encryptedString);

const decryptedString = decryptString(encryptedString, key);
console.log("Decrypted:", decryptedString);



// 引入 CryptoJS 库 (在 HTML 文件中)
// <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

代码解释和要点:

  • 依赖 CryptoJS: 这段代码使用了 CryptoJS 库进行 AES 加密。你需要在你的 HTML 文件中引入 CryptoJS 库。
  • AES 加密: AES 是一种对称加密算法,这意味着加密和解密使用相同的密钥。
  • 密钥 (key): 密钥 key 用于加密和解密,非常重要。建议使用长度至少为 16 位的强密钥,并妥善保管,不要将其暴露在客户端代码中。 理想情况下,密钥应该存储在服务器端,并在需要时安全地传输到客户端。
  • 初始化向量 (IV): iv (初始化向量)增加了加密的安全性,防止相同的明文在使用相同的密钥加密时产生相同的密文。这里使用了 key 的前 16 个字符作为 IV。
  • CBC 模式: CBC (Cipher Block Chaining) 模式是一种常用的加密模式,它将每个明文块与前一个密文块进行异或运算后再进行加密,提高了安全性。
  • PKCS7 填充: PKCS7 填充是一种标准的填充方式,用于处理明文长度不是加密块大小整数倍的情况。
  • Base64 编码: 加密后的结果是二进制数据,为了方便存储和传输,将其转换为 Base64 编码的字符串。
  • 错误处理: 代码包含了 try...catch 块来处理潜在的错误,例如密钥或密文格式无效。
  • 安全性: 虽然这段代码提供了前端加密的功能,但需要注意的是,纯前端的加密并不能保证绝对的安全性。攻击者仍然可以通过分析你的 JavaScript 代码来获取密钥。 为了更高的安全性,建议将加密操作放在服务器端进行。

改进建议:

  • 密钥管理: 不要将密钥硬编码在客户端代码中。 最佳实践是将密钥

标签:加密,iv,密钥,key,字符串,const,CryptoJS,方法
From: https://www.cnblogs.com/ai888/p/18560364

相关文章

  • 写一个方法去掉字符串中的空格
    有多种方法可以去除JavaScript字符串中的空格,以下是几种常见且有效的方法:1.使用trim()方法(去除字符串开头和结尾的空格):这是最常用的方法,它可以去除字符串开头和结尾的空格,但不影响字符串中间的空格。conststr="Hello,world!";consttrimmedStr=str.trim();......
  • SpringBoot开发——统计接口调用耗时的几种方法
    文章目录一、统计接口调用耗时的方法二、代码实现1、使用AOP统计接口调用耗时1.1引入依赖1.2创建切面类1.3测试接口2、使用SpringBootActuator2.1引入依赖2.2访问端点2.3配置端点3、使用过滤器统计接口调用耗时3.1定义过滤器类3.2启......
  • 【头歌实训:利用栈判断字符串是否为回文串】
    头歌实训:利用栈判断字符串是否为回文串文章目录任务描述相关知识回文串编程要求测试说明源代码:任务描述本关任务:基于栈stack数据结构判断字符串是否为“回文串”。相关知识为了完成本关任务,你需要掌握:1.如何创建一个栈,2.入栈、出栈操作,3.“回文串”概......
  • 已下载directⅩ没有找d3d11.dll如何处理?详细的处理方法及操作流程
    当你遇到d3d11.dll缺失或损坏的问题时,这通常意味着DirectX组件不完整或已经损坏。DirectX是一个由Microsoft开发的组件集合,用于处理任务,如图形渲染、视频播放等。下面是如何处理d3d11.dll问题的详细步骤:重新安装DirectX有时候,DirectX组件可能因为某些原因损坏或丢失......
  • 安全基础:数字信封、数字签名、数字证书(加签验签,加密解密)
    数字签名的作用:完整性没有被篡改;不可抵赖性,用自己私钥签名的明文(签名是独有的私自的),只有用自己的公钥才能解密。数字信封的作用:用接收方的公钥加密形成信封(信封的内容是公开的);保证数据传输的真实性和不可窥探性(确保客户端随机生成的对称秘钥加密安全传输)在互联网安全通信中......
  • 具体的restoreSnapshot方法
    好的,让我们详细分析restoreSnapshot方法。这个方法位于SnapshotServiceImpl类中,负责从快照中恢复指定的索引。以下是方法的详细分析:方法签名privatevoidrestoreSnapshot(StringrepositoryName,StringsnapshotName,List<String>indicesList,DatedelTime,Longid)t......
  • ExpressionTreeHelper 表达式树泛型委托拷贝方法
    varpeople=newPeople(){Id=11,Name="Richard",Age=31};intcount=1_000_000;varcommon=HiPerfTimer.Execute(()=>{for(inti=0;i<count;i++){varitem=newPeopleCopy(){......
  • 常见9种软件测试方法【定义、使用场景、优势、略势、不同点】
     一、功能测试1.定义功能测试是对软件功能进行验证的测试活动,依据功能需求规格说明书,检查软件系统的各项功能是否能正确运行,包括功能的准确性、完整性等方面。2.使用场景新软件功能开发完成时,确保功能符合预期。软件进行功能升级或改进后。3.优势直接对应需求:可直观......
  • 【springboot开发】SpringBoot中出入参增强的5种方法 : 加解密、脱敏、格式转换、时间
    1.使用@JsonSerialize和@JsonDeserialize注解2.全局配置Jackson的ObjectMapper3.使用@ControllerAdvice配合@InitBinder4.自定义HttpMessageConverter5.使用AOP进行切面编程结语在SpringBoot中,对接口的请求入参和出参进行自定义的增......
  • 最全亚马逊批量实时采集商品链接方法(图文详解),还能看市场集中度!
    第一步:准备关键词、类目ID、店铺ID、ASIN可以通过选关键词、选类目2种方式采集关键词,自己卡条件批量下载下来。第二步:了解以词挖品、类目top1万采集、畅销榜采集、店铺挖品、僵尸链接、asin采集等等以词挖品方法一以词挖品方法二以词挖品方法三以词挖品方法四......