हमारे पास जावा स्प्रिंग बैकएंड है जो कुछ कॉलम का उपयोग करके एन्क्रिप्ट करता है:

Encryptors.queryableText(secretKey, new String(Hex.encode(salt.getBytes(Charsets.UTF_8))));

यह एक विशिष्ट कॉन्फ़िगरेशन में TextEncryptor प्रकार का ऑब्जेक्ट बनाता है जो तब textEncryptor.encrypt(msg) के साथ एन्क्रिप्ट कर सकता है और textEncryptor.decrypt(msg) के साथ डिक्रिप्ट कर सकता है। स्प्रिंग सुरक्षा द्वारा प्रदान की गई एन्क्रिप्शन की इस पद्धति का उपयोग एन्क्रिप्टेड कॉलम को क्वेरी करने योग्य बनाने के लिए किया जाता है। एक ही पाठ हमेशा एक ही एन्क्रिप्टेड स्ट्रिंग की ओर ले जाएगा।

एक अन्य नोड.जेएस बैकएंड को अब समेकित रिपोर्ट जेनरेट करने के लिए कुछ एन्क्रिप्टेड कॉलम तक पहुंचने की आवश्यकता है।

मुझे कुछ लेख मिले जो उस समस्या को काफी अच्छी तरह से संबोधित करते हैं: https://stackanswers.net/questions/spring-4-encryptors-vs- क्रिप्टोजस

मैंने अपनी आवश्यकताओं के अनुरूप उस कोड को बदल दिया। IV और नमक को Encryptors.queryableText() द्वारा निर्दिष्ट की तरह ठीक किया जाना था:

/*! 
* Author: flohall
* date: 2019-11-05
* file: module/textEncryptor.js
*/
var CryptoJS = require("crypto-js");
var config = require('../config.json');
//keySize and iteration like specified in spring for AesBytesEncryptor
const keySize = 256;
const iterations = 1024;
//see config.json
const salt = CryptoJS.enc.Hex.parse(config.textEncryptor.hexEncodedSalt);
const secretKey = config.textEncryptor.secretKey;
const key = CryptoJS.PBKDF2(secretKey, salt, {
    keySize: keySize / 32,
    iterations: iterations
});

//same as NULL_IV_GENERATOR of AesBytesEncryptor - so encryption creates always same cipher text for same input
const iv = {words: [0, 0, 0, 0, 0, 0, 0, 0], sigBytes: 0}
const cfg = {
    iv: iv,
    padding: CryptoJS.pad.Pkcs7,
    mode: CryptoJS.mode.CBC
}

exports.encrypt = function (msg) {

    const encrypted = CryptoJS.AES.encrypt(msg, key, cfg);
    return encrypted.ciphertext.toString();
}

exports.decrypt = function (encryptedMessage) {

    var decrypted = CryptoJS.AES.decrypt(encryptedMessage, key, cfg)
    return decrypted.toString(CryptoJS.enc.Utf8);

}

अब तक इतना अच्छा - यह जानना महत्वपूर्ण है कि नोड.जेएस फ़ंक्शन को दिया गया config.textEncryptor.hexEncodedSalt पहले से ही hexencoded नमक है। मैंने इसका उपयोग करके उत्पन्न किया:

//salt is read from application.yml and not hexencoded yet
System.out.println(new String(Hex.encode(salt.getBytes(Charsets.UTF_8))));

Node.js textEncryptor.encrypt(msg) विधि जावा में textEncryptor.encrypt(msg) के समान एन्क्रिप्टेड संदेश उत्पन्न करती है, लेकिन फिर भी textEncryptor.decrypt(msg) node.js में उसी तरह से डिक्रिप्ट करने में सक्षम नहीं है जैसे textEncryptor.decrypt(msg) जावा में करता है।

नोड.जेएस में यह परीक्षण कोड काम नहीं करता है:

var textEncryptor = require('./modules/textEncryptor.js');

var encrypted = textEncryptor.encrypt("helloWorld")
var decrypted = textEncryptor.decrypt(encrypted)
console.log(encrypted);
console.log(decrypted);

यह केवल डिक्रिप्टेड टेक्स्ट को प्रिंट करता है जिसके बाद एक खाली लाइन आती है।
कोई विचार - मुझे क्या याद आ रहा है?

2
flohall 6 नवम्बर 2019, 01:21

1 उत्तर

सबसे बढ़िया उत्तर

मजेदार यह पूछने के तुरंत बाद मुझे पता चला कि मैं क्या खो रहा था। यह काम करता है, लेकिन मुझे इस तरह की उम्मीद नहीं थी, क्योंकि यह मेरे प्रश्न में जुड़े लेख में वर्णित से अलग है। encryptedMessage को पहले हेक्स पार्स करना होगा और किसी ऑब्जेक्ट में डालना होगा।

exports.decrypt = function (encryptedMessage) {

    var encrypted = { ciphertext: CryptoJS.enc.Hex.parse(encryptedMessage)};
    var decrypted = CryptoJS.AES.decrypt(encrypted, key, cfg)
    return decrypted.toString(CryptoJS.enc.Utf8);

}

सही समाधान:

/*! 
* Author: flohall
* date: 2019-11-05
* file: module/textEncryptor.js
*/
var CryptoJS = require("crypto-js");
var config = require('../config.json');
//keySize and iteration like specified in spring for AesBytesEncryptor
const keySize = 256;
const iterations = 1024;
//see config.json
const salt = CryptoJS.enc.Hex.parse(config.textEncryptor.hexEncodedSalt);
const secretKey = config.textEncryptor.secretKey;
const key = CryptoJS.PBKDF2(secretKey, salt, {
    keySize: keySize / 32,
    iterations: iterations
});

//same as NULL_IV_GENERATOR of AesBytesEncryptor - so encryption creates always same cipher text for same input
const iv = {words: [0, 0, 0, 0, 0, 0, 0, 0], sigBytes: 0}
const cfg = {
    iv: iv,
    padding: CryptoJS.pad.Pkcs7,
    mode: CryptoJS.mode.CBC
}

exports.encrypt = function (msg) {

    const encrypted = CryptoJS.AES.encrypt(msg, key, cfg);
    return encrypted.ciphertext.toString();
}

exports.decrypt = function (encryptedMessage) {

    var encrypted = { ciphertext: CryptoJS.enc.Hex.parse(encryptedMessage)};
    var decrypted = CryptoJS.AES.decrypt(encrypted, key, cfg)
    return decrypted.toString(CryptoJS.enc.Utf8);

}
1
flohall 6 नवम्बर 2019, 01:52