#javascript #php #node.js #encryption #openssl
Вопрос:
Это функция, используемая для шифрования в php
function generatetoken()
{
$token = ['id' => '123456','name' => 'username','email' => 'useremail@example.com','type' => 'user'];
$cipher = "AES-128-CBC";
$plaintext = json_encode($token);
$ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, '123456789', $options = OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, '123456789', $as_binary = true);
$ciphertext = base64_encode($iv . $hmac . $ciphertext_raw);
return ciphertext;
}
У меня есть эта функция для расшифровки текста на php :
function decodetokeninPhp($request_token)
{
$cipher = "AES-128-CBC";
$c = base64_decode($request_token);
$ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len = 32);
$ciphertext_raw = substr($c, $ivlen $sha2len);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, '123456789', $options = OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, '123456789', $as_binary = true);
if (hash_equals($hmac, $calcmac)) {
return json_encode($original_plaintext);
} else {
return null;
}
}
Я хочу эквивалент этого в javascript/Nodejs, я попробовал это:
function decode(token){
var password = 'My-key';
const ivLength = 16;
const sha2len = 32;
let replacedToken = token.toString();
const base64decoded = Buffer.from(replacedToken, 'base64').toString('binary');
const iv = replacedToken.substr(0,ivLength);
const hMac= replacedToken.substr( ivLength,sha2len);
const ciphertext_raw = replacedToken.substr(ivLength sha2len);
var DataEncrypt = ciphertext_raw;
var DataKey = CryptoJS.enc.Utf8.parse(password);
var DataVector = CryptoJS.enc.Utf8.parse(iv);
var decrypted = CryptoJS.AES.decrypt(DataEncrypt, DataKey, { iv: DataVector });
var decrypted = CryptoJS.enc.Utf8.stringify(JSON.stringify(decrypted));
console.log("token decoded" decrypted);
}
Но в console.log просто выведите «декодированный токен:», это пустой результат 🙁
Пожалуйста, кто-нибудь, помогите мне, я схожу с ума :/
Комментарии:
1. Регистрировали ли вы какие-либо предыдущие значения, чтобы определить, где оно становится пустым?
2. Почему вы инициализируете некоторые переменные с
var
помощью ? Вы можете изменить их все наlet
или дажеconst
если вы не переназначаете3. @El_Vanja да, в этой строке результат стал пустым : var расшифрован = CryptoJS.enc.Utf8.stringify(JSON.stringify(расшифрован));
4. @adiga да, вы правы , я изменю это, сейчас я просто хочу, чтобы это сработало, я схожу с ума от этого :/
5. Хорошо, так какова же ценность
decrypted
, прежде чем вы передадите ее в эту строку?
Ответ №1:
Если вы хотите использовать крипто-модуль NodeJS, необходимо изменить всю часть CryptoJS. Возможной реализацией с помощью crypto является:
var crypto = require('crypto');
function decode(token){
var keyDec = Buffer.from('0123456789012345', 'utf8'); // sample key for encryption/decryption
var keyAuth = Buffer.from('0123456789', 'utf8'); // sample key for authentication
var ivLen = 16;
var macLen = 32;
var tokenBuf = Buffer.from(token, 'base64');
var iv = tokenBuf.slice(0, ivLen);
var mac = tokenBuf.slice(ivLen, ivLen macLen);
var ciphertext = tokenBuf.slice(ivLen macLen);
// Authenticate
var hmac = crypto.createHmac('sha256', keyAuth);
hmac.update(ciphertext);
var macCalc = hmac.digest();
if (macCalc.equals(mac)) {
// Decrypt, if authentication is successfull
var decipher = crypto.createDecipheriv("AES-128-CBC", keyDec, iv);
var decrypted = decipher.update(ciphertext, '', 'utf-8');
decrypted = decipher.final('utf-8');
return JSON.parse(decrypted);
} else {
console.log("Decryption failed");
}
}
var token = decode('U3pukkS48yeNpsusv43Tmv2AmmDfYVtQ8jPw2izEQ0CVOfutGtA9e3ZWXJo2Ibi2axo31blnW6uq/yCz/KRSltwGhCmwpiHQ8mP5ulMf0Nr9V9Gzr6r R6y3ZOpzTsV9IEkaKDxZTihfoDAzeyN9LYKS9uUW6URL0Do1HGaZ51o='); // from PHP code
console.log(token);
Здесь зашифрованный текст был сгенерирован с использованием опубликованного PHP-кода с использованием примеров ключей 0123456789012345
и 0123456789
для шифрования и аутентификации, соответственно.
Я с подозрением json_encode()
отношусь к коду PHP для расшифровки. Здесь я ожидал бы a json_decode()
и, таким образом, в коде NodeJS a JSON.parse()
(но вы можете изменить это по мере необходимости).
Комментарии:
1. Вот и все, спасибо, мама, ты спасла мой день и мое здравомыслие, очень, очень спасибо тебе 🙂