繁体   English   中英

node.js 中的 Java PBEWITHSHA1ANDDESEDE 加密等价物?

[英]Java PBEWITHSHA1ANDDESEDE encryption equivalent in node.js?

我继承了 Java Web 应用程序,应该将其转换为 node.js。

其中一部分是数据加密。 在 Java 中,它就像在附加代码中一样完成。 我将如何使用加密在节点中做到这一点?

我根本不擅长密码学,对不起,如果这真的是基本问题,并提前致谢。

private final String ALGORITHM = "PBEWITHSHA1ANDDESEDE";
private final int ITERATION_COUNT = 20;
private final byte[] SALT = {
        (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
        (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
    };

然后...

PBEKeySpec pbeKeySpec = new PBEKeySpec("password".toCharArray());
SecretKeyFactory keyFac = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(SALT, ITERATION_COUNT);

// Create PBE Cipher
Cipher pbeCipher = Cipher.getInstance(ALGORITHM);

// Initialize PBE Cipher with key and parameters
pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);

byte[] encrypted = pbeCipher.doFinal("text to be encrypted");

编辑:这是我基于各种搜索在 node.js 中实现它的失败尝试:

var crypto = require('crypto');
var SALT = new Buffer('c773218c7ec8ee99', 'hex');
var pass = new Buffer('password');

//digest is by default SHA-1 thats what I need
var key = crypto.pbkdf2Sync(pass, SALT, 20, 56); //[, digest]
//var cipher = crypto.createCipher('des-ede-cbc', key);
var cipher = crypto.createCipher('des-ede', key);
//var cipher = crypto.createCipheriv('des-ede-cbc', key, new Buffer('00000000', 'binary'));
cipher.update(new Buffer('This is to be encoded'));
var encrypted = cipher.final('binary');
console.log(encrypted);
fs.writeFileSync('encrypted.file', encrypted);

当我尝试使用crypto.createCipheriv我不知道该放什么作为 IV。

在没有 IV 的情况下使用时,它会产生一些“加密”的胡言乱语,但是当保存到文件时,它无法在 Java 端读取和解码。 叹。

你不能让它们互操作的原因是 Java 端使用PBE而 node.js 端使用PBKDF2 ,它们用于类似的目的并且来自相同的标准文档(PKCS #5),但具有非常不同的机制在引擎盖下。

因为这些是不同的密钥生成算法,所以你在每一端生成不同的密钥,从而在解密时得到不同的结果。

您的代码中 java 和 node.js 之间的抽象级别也存在一些不匹配。 您使用的 Java API 是非常高级的,并且使用了类似 OpenSSL 的结构。 同时,node.js 代码处于低得多的级别,将各个部分一点一点地粘合在一起。 例如,当 java 代码引入特定的填充结构或密码操作模式时,这可能会导致问题。

如果这只是为了学习或一些非关键的事情,我会建议将java代码更改为与node.js代码处于同一级别,并将其一块一块地放在一起:在两侧生成密钥并确保他们是相同的,ECRYPT两侧,并得到相同的输出,等等。如果你不能改变Java代码,使用类似伪造同一更高水平的Java代码,让您的Node.js代码。 但正如对这个问题的评论所表明的那样,你可能无论如何都无法进行 PBE。

如果这是为了“真实”的东西,您实际上希望保存的文件是安全的,请调用像 gpg 这样的外部程序来处理加密,而不是“推出您自己的”文件加密系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM