Encryption JavaScript字符串加密和解密?

Encryption JavaScript字符串加密和解密?,encryption,javascript,Encryption,Javascript,我感兴趣的是构建一个供个人使用的小应用程序,它将使用JavaScript在客户端加密和解密信息。加密信息将存储在服务器上的数据库中,但不会存储解密版本 它不必是超级复制者安全的,但我想使用一个当前未中断的算法 理想情况下,我可以做一些类似的事情 var gibberish = encrypt(string, salt, key); var sensical = decrypt(gibberish, key); 生成编码字符串,类似于 var gibberish = encrypt(strin

我感兴趣的是构建一个供个人使用的小应用程序,它将使用JavaScript在客户端加密和解密信息。加密信息将存储在服务器上的数据库中,但不会存储解密版本

它不必是超级复制者安全的,但我想使用一个当前未中断的算法

理想情况下,我可以做一些类似的事情

var gibberish = encrypt(string, salt, key);
var sensical = decrypt(gibberish, key);
生成编码字符串,类似于

var gibberish = encrypt(string, salt, key);
var sensical = decrypt(gibberish, key);
以后再解码

到目前为止,我已经看到:

我还应该看看其他的图书馆吗?

怎么样

这是一个可靠的加密库,具有很多功能。它实现哈希、HMAC、PBKDF2和密码。在这种情况下,您需要的是密码。查看项目主页上的快速入门指南

您可以使用AES执行以下操作:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>

<script>
    var encryptedAES = CryptoJS.AES.encrypt("Message", "My Secret Passphrase");
    var decryptedBytes = CryptoJS.AES.decrypt(encryptedAES, "My Secret Passphrase");
    var plaintext = decryptedBytes.toString(CryptoJS.enc.Utf8);
</script>

var encryptedAES=CryptoJS.AES.encrypt(“消息”、“我的秘密密码”);
var decryptedBytes=CryptoJS.AES.decrypt(encryptedAES,“我的秘密密码”);
var plaintext=decryptedBytes.toString(CryptoJS.enc.Utf8);
至于安全性,在我写这篇文章的时候,AES算法被认为是完好无损的

编辑:

似乎在线URL已关闭&您可以从下面给定的链接使用下载的文件进行加密,并将相应的文件放在应用程序的根文件夹中

或使用其他CDN,如

var encrypted=CryptoJS.AES.encrypt(“消息”、“秘密密码”);
//u2fsdgvkx18zuvvshfse21qhsqeqzxmxq9zghy+bu0=
var decrypted=CryptoJS.AES.decrypt(加密的“秘密密码短语”);
//4d657373616765
document.getElementById(“demo1”).innerHTML=加密;
document.getElementById(“demo2”).innerHTML=已解密;
document.getElementById(“demo3”).innerHTML=decrypted.toString(CryptoJS.enc.Utf8)
完整的工作示例实际上是:


加密的
解密
实际信息
不再支持CryptoJS。如果要继续使用,可以切换到此url:


现代浏览器现在支持
加密加密API,该API使用以下方法之一提供本机加密和解密功能(异步不少于!):AES-CBC、AES-CTR、AES-GCM或RSA-OAEP


我创建了一个不安全但简单的文本密码/解密工具。与任何外部库都没有依赖关系

这些是功能

const cipher = salt => {
    const textToChars = text => text.split('').map(c => c.charCodeAt(0));
    const byteHex = n => ("0" + Number(n).toString(16)).substr(-2);
    const applySaltToChar = code => textToChars(salt).reduce((a,b) => a ^ b, code);

    return text => text.split('')
        .map(textToChars)
        .map(applySaltToChar)
        .map(byteHex)
        .join('');
}

const decipher = salt => {
    const textToChars = text => text.split('').map(c => c.charCodeAt(0));
    const applySaltToChar = code => textToChars(salt).reduce((a,b) => a ^ b, code);
    return encoded => encoded.match(/.{1,2}/g)
        .map(hex => parseInt(hex, 16))
        .map(applySaltToChar)
        .map(charCode => String.fromCharCode(charCode))
        .join('');
}
您可以按如下方式使用它们:

// To create a cipher
const myCipher = cipher('mySecretSalt')

//Then cipher any text:
myCipher('the secret string')   // --> "7c606d287b6d6b7a6d7c287b7c7a61666f"

//To decipher, you need to create a decipher and use it:
const myDecipher = decipher('mySecretSalt')
myDecipher("7c606d287b6d6b7a6d7c287b7c7a61666f")    // --> 'the secret string'
使用

使用encrypt()和decrypt()

要使用SimpleCrypto,首先使用 密钥(密码)。必须在以下情况下定义密钥参数: 创建SimpleCrypto实例

要加密和解密数据,只需使用encrypt()和decrypt()即可 从一个实例执行函数。这将使用AES-CBC加密算法

简单的功能


function Encrypt(value) 
{
  var result="";
  for(i=0;i<value.length;i++)
  {
    if(i<value.length-1)
    {
        result+=value.charCodeAt(i)+10;
        result+="-";
    }
    else
    {
        result+=value.charCodeAt(i)+10;
    }
  }
  return result;
}
function Decrypt(value)
{
  var result="";
  var array = value.split("-");

  for(i=0;i<array.length;i++)
  {
    result+=String.fromCharCode(array[i]-10);
  }
  return result;
} 

函数加密(值)
{
var结果=”;

对于(i=0;i利用SJCL、CryptoJS和/或WebCryptop的现有答案不一定是错误的,但它们并不像您最初怀疑的那样安全。通常您希望这样。首先,我将解释原因,然后解释如何

为什么不使用SJCL、CryptoJS、WebCryptop等。? 简短回答:为了使您的加密真正安全,这些库希望您做出太多的选择,例如分组密码模式(CBC、CTR、GCM;如果您无法判断我刚才列出的三种模式中的哪一种是安全的,以及在什么约束条件下使用,那么您根本不应该承担这种选择的负担)

除非你的职位是密码工程师,否则你很难安全地实现它

为什么要避免CryptoJS? CryptoJS提供了一些构建块,希望您知道如何安全地使用它们。()

为什么CBC模式不好? 阅读

为什么要避免WebCrypto? WebCrypto是一个由委员会设计的聚餐标准,其目的与密码工程是正交的

为什么要避免SJCL? SJCL的公共API和文档要求用户使用人工记忆的密码加密数据。在现实世界中,这几乎是不可能的

另外:它的默认PBKDF2轮数大约为。AES-128-CCM可能可以

在上述三种选择中,SJCL最不可能以眼泪告终。但还有更好的选择

为什么利伯纳更好? 您不需要在密码模式、哈希函数和其他不必要的选项菜单之间进行选择。您永远不会选择

相反,它只为您提供了简单的选项,这些选项针对最大的安全性和最低限度的API进行了调优

  • crypto\u box()
    /
    crypto\u box\u open()
    提供经过身份验证的公钥加密。
    • 所讨论的算法结合了X25519(曲线上的ECDH 25519)和XSalsa20-Poly1305,但您不需要知道(甚至不需要关心)就可以安全地使用它
  • crypto\u secretbox()
    /
    crypto\u secretbox\u open()
    提供共享密钥认证加密。
    • 所讨论的算法是XSalsa20-Poly1305,但您不需要知道/关心
另外,LibNasdium有,所以当试图与另一个编程堆栈进行互操作时,LibNasdium很有可能只工作。而且,LibNasdium往往速度非常快,而且不会牺牲安全性

如何在JavaScript中使用lib? 首先,你需要决定一件事:

  • 您是否只想加密/解密数据(并且可能仍然以某种方式在数据库查询中安全地使用明文),而不担心细节?或者
  • 您需要实现特定的协议吗
  • 如果选择了第一个选项,请获取

    文档很简单。
    EncryptedField
    对于大多数用例来说已经足够了,但是
    EncryptedRow
    encryptedmultirrows
    API可能会更容易,如果您有很多
    const CryptoJS = require("crypto-js");
    
    
       //The Function Below To Encrypt Text
       const encryptWithAES = (text) => {
          const passphrase = "My Secret Passphrase";
          return CryptoJS.AES.encrypt(text, passphrase).toString();
        };
        //The Function Below To Decrypt Text
        const decryptWithAES = (ciphertext) => {
          const passphrase = "My Secret Passphrase";
          const bytes = CryptoJS.AES.decrypt(ciphertext, passphrase);
          const originalText = bytes.toString(CryptoJS.enc.Utf8);
          return originalText;
        };
    
      let encryptText = encryptWithAES("YAZAN"); 
      //EncryptedText==>  //U2FsdGVkX19GgWeS66m0xxRUVxfpI60uVkWRedyU15I= 
    
      let decryptText = decryptWithAES(encryptText);
      //decryptText==>  //YAZAN 
    
    async function aesGcmEncrypt(plaintext, password)
    
    async function aesGcmDecrypt(ciphertext, password) 
    
    const crypt = (salt, text) => {
      const textToChars = (text) => text.split("").map((c) => c.charCodeAt(0));
      const byteHex = (n) => ("0" + Number(n).toString(16)).substr(-2);
      const applySaltToChar = (code) => textToChars(salt).reduce((a, b) => a ^ b, code);
    
      return text
        .split("")
        .map(textToChars)
        .map(applySaltToChar)
        .map(byteHex)
        .join("");
    };
    
    const decrypt = (salt, encoded) => {
      const textToChars = (text) => text.split("").map((c) => c.charCodeAt(0));
      const applySaltToChar = (code) => textToChars(salt).reduce((a, b) => a ^ b, code);
      return encoded
        .match(/.{1,2}/g)
        .map((hex) => parseInt(hex, 16))
        .map(applySaltToChar)
        .map((charCode) => String.fromCharCode(charCode))
        .join("");
    };
    
    // encrypting
    const encrypted_text = crypt("salt", "Hello"); // -> 426f666665
    
    // decrypting
    const decrypted_string = decrypt("salt", "426f666665"); // -> Hello