Je suis intéressé par la création d'une petite application à usage personnel qui chiffrera et déchiffrera les informations côté client à l'aide de JavaScript. Les informations chiffrées seront stockées dans une base de données sur un serveur, mais jamais la version déchiffrée.
Il n’est pas nécessaire que ce soit ultra sécurisé, mais j’aimerais utiliser un algorithme ininterrompu.
Idéalement, je serais capable de faire quelque chose comme
var gibberish = encrypt(string, salt, key);
pour générer la chaîne encodée, et quelque chose comme
var sensical = decrypt(gibberish, key);
pour le décoder plus tard.
Jusqu'à présent, j'ai vu ceci: http://bitwiseshiftleft.github.io/sjcl/
Y a-t-il d'autres bibliothèques à consulter?
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
//U2FsdGVkX18ZUVvShFSES21qHsQEqZXMxQ9zgHy+bu0=
var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
//4d657373616765
document.getElementById("demo1").innerHTML = encrypted;
document.getElementById("demo2").innerHTML = decrypted;
document.getElementById("demo3").innerHTML = decrypted.toString(CryptoJS.enc.Utf8);
Full working sample actually is:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
<br><br>
<label>encrypted</label>
<div id="demo1"></div>
<br>
<label>decrypted</label>
<div id="demo2"></div>
<br>
<label>Actual Message</label>
<div id="demo3"></div>
Que diriez-vous de CryptoJS ?
C'est une solide bibliothèque de cryptographie, avec beaucoup de fonctionnalités. Il implémente les hashers, HMAC, PBKDF2 et les chiffrements. Dans ce cas, ciphers est ce dont vous avez besoin. Consultez le guide de démarrage rapide sur la page d'accueil du projet.
Vous pouvez faire quelque chose comme avec l'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>
En ce qui concerne la sécurité, au moment de mon écriture, l'algorithme AES est considéré comme ininterrompu
Modifier:
Apparemment, l'URL en ligne est en panne et vous pouvez utiliser les fichiers téléchargés pour le chiffrement à partir du lien ci-dessous, puis placez les fichiers correspondants dans votre dossier racine de l'application.
https://code.google.com/archive/p/crypto-js/downloads
ou utilisé un autre CDN comme https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js
J'ai créé un utilitaire de chiffrement/déchiffrement de texte simple. Aucune dépendance avec une bibliothèque externe.
Ce sont les fonctions
let cipher = salt => {
let textToChars = text => text.split('').map(c => c.charCodeAt(0))
let byteHex = n => ("0" + Number(n).toString(16)).substr(-2)
let applySaltToChar = code => textToChars(salt).reduce((a,b) => a ^ b, code)
return text => text.split('')
.map(textToChars)
.map(applySaltToChar)
.map(byteHex)
.join('')
}
let decipher = salt => {
let textToChars = text => text.split('').map(c => c.charCodeAt(0))
let saltChars = textToChars(salt)
let 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('')
}
Et vous pouvez les utiliser comme suit:
// To create a cipher
let myCipher = cipher('mySecretSalt')
//Then cipher any text:
myCipher('the secret string') // --> "7c606d287b6d6b7a6d7c287b7c7a61666f"
//To decipher, you need to create a decipher and use it:
let myDecipher = decipher('mySecretSalt')
myDecipher("7c606d287b6d6b7a6d7c287b7c7a61666f") // --> 'the secret string'
Les navigateurs modernes prennent désormais en charge l'API crypto.subtle
, qui fournit des fonctions de cryptage et de décryptage natifs (async non moins!) À l'aide de l'une des méthodes suivantes: AES-CBC, AES-CTR, AES-GCM ou RSA-OAEP.
CryptoJS n'est plus pris en charge. Si vous souhaitez continuer à l'utiliser, vous pouvez passer à cette URL:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
Fonctions simples,
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;
}
Utilisez SimpleCrypto
Utilisation de encrypt () et decrypt ()
Pour utiliser SimpleCrypto, créez d'abord une instance SimpleCrypto avec une clé secrète (mot de passe). Le paramètre de clé secrète DOIT être défini lors de la création d'une instance SimpleCrypto.
Pour chiffrer et déchiffrer des données, utilisez simplement les fonctions encrypt () et decrypt () d'une instance. Cela utilisera l'algorithme de chiffrement AES-CBC.
var _secretKey = "some-unique-key";
var simpleCrypto = new SimpleCrypto(_secretKey);
var plainText = "Hello World!";
var chiperText = simpleCrypto.encrypt(plainText);
console.log("Encryption process...");
console.log("Plain Text : " + plainText);
console.log("Cipher Text : " + cipherText);
var decipherText = simpleCrypto.decrypt(cipherText);
console.log("... and then decryption...");
console.log("Decipher Text : " + decipherText);
console.log("... done.");