Articles of encryption

为什么crypto.createHash在新版本中返回不同的输出?

问题 我有使用crypto.createHash生成md5散列的node.js模块。 最近我注意到crypto模块生成的hash在新版本中是不同的: 码 require('crypto').createHash('md5').update('¥').digest('hex') Node.js v0.10.0 输出: ab3af8566ddd20d7efc9b314abe90755 Node.js v6.1.0 输出: 07625e142e4ac5961de57472657a88c1 题 我想知道是什么原因,在新版本,我该如何解决这个问题? 更新 GitHub上的类似问题: https://github.com/nodejs/node/issues/6813 https://github.com/node-xmpp/client/issues/206

基于令牌的authentication(在Node.js中)

更多关于一些关于实现基于令牌的authentication系统的build议的一般缺点问题,由于Node.js似乎并没有做好准备。 由于我们要构build一个无状态的API服务器来操作我们的数据存储,我们希望为用户提供一个授权令牌(一个“乘车票”),这个令牌将包含在API的每次调用中。 问题是如何以安全的方式生成这个令牌。 [idea 1] – 用户通过发送(user-id,password-hash)到服务器来请求auth令牌 – 服务器响应(user_id,expiry_date),由API服务器签名随机Key – 服务器可以检查每个token的有效性请求 – 服务器将需要在有限的时间内存储令牌 [思想2] – 同上,但避免发送密码哈希 – 用户请求身份validation令牌 – 服务器发送用户挑战,用户然后用他(user_id,password_hash)对哈希挑战 – 服务器validation这一点,然后生成令牌按照想法1。 [思路3] – 使用密码哈希本身作为authentication令牌,在每个请求中发送,以避免令牌pipe理问题 – 更简单但没有时间限制 [思路4] – 与2相同,但challenged_hashed_by_(user_id,password_hash)成为令牌并在每个请求中发送 感谢任何指针

Crypto.randomBytes处理exception做到熵不足?

在这个方法的文档中,如果没有足够的熵来产生数据,它将会抛出exception。 我的问题属于熵。 它是如何产生的,你可以通过提供适当的熵来防止抛出exception吗? 抛出exception多么普遍,还是未知? crypto.randomBytes文档: crypto.randomBytes(size,[callback]) // async crypto.randomBytes(256, function(ex, buf) { if (ex) throw ex; console.log('Have %d bytes of random data: %s', buf.length, buf); }); 生成密码强的伪随机数据。 如果没有足够的累积熵来生成密码强的数据,将抛出错误或调用错误的callback 。 换句话说,即使所有的熵源都被耗尽,没有callback的crypto.randomBytes也不会被阻塞。 在下面的例子中,我将如何正确处理exception,并且仍然完全填充数组,基本上确保数组已经完全填充了生成的字节。 我只是捕捉exception,并在catch块中生成一个新的数组,但如果这也会引发exception? 本质上,我如何使这段代码100%的时间正常工作? var codes = []; for(var i = 0;i < 100;i++){ (function(i){ crypto.randomBytes(256, function(ex, buf) { if (ex) throw ex; codes[i] = buf.toString('hex'); […]

与crypto.createSign一起使用密码保护的私钥

我正在尝试使用node.jsencryptionAPI和一个密码保护的私钥来签署和validation消息,它使我了解到: > var sig = crypto.createSign('RSA-SHA256').update('psst').sign(pk,'hex'); Enter PEM pass phrase: 在这一点上节点就locking了。 我似乎无法find一个选项来以编程方式传递密码。

尝试使用私钥解密邮件时出现节点rsa错误

所以我一直试图使用node -rsa和jsencrypt的 javascript来创build一个网站(为一个任务),其中JavaScript客户端获取由服务器生成的公钥(node-rsa),encryption消息(jsencrypt)用户已经进入,将其发送到服务器并获取服务器解密(node-rsa)。 密钥的生成工作,encryption工作,但解密没有。 当我启动节点脚本,我做了以下encryption… var NodeRSA = require('node-rsa'); var myDecrypter = new NodeRSA({b: 512}); 当客户端请求密钥(我使用快速)时,运行以下内容。 app.get('/getPublicKey', function(req, res){ var publicKeyJson = {"Key": ""}; console.log(myDecrypter.exportKey('public')); publicKeyJson.Key = myDecrypter.exportKey('public'); res.json(JSON.stringify(publicKeyJson)); }); 客户端然后像这样保存这个键… var myEncrypter = new JSEncrypt(); var myJson = ""; $.getJSON( "getPublicKey", function( data ) { myJson = JSON.parse(data).Key; setKey(); }); function setKey() { myEncrypter.setPublicKey(myJson); […]

在节点中encryption并在java中解密

我有一个在Java中的encryption代码。 我试图将encryption部分移植到节点。 基本上,节点将使用encryption模块进行encryption,然后Java将执行解密。 以下是我如何在Java中进行encryption: protected static String encrypt(String plaintext) { final byte[] KEY = { 0x6d, 0x79, 0x56, 0x65, 0x72, 0x79, 0x54, 0x6f, 0x70, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b }; try { Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); final SecretKeySpec secretKey = new SecretKeySpec(KEY, "AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); final String encryptedString = Base64.encodeToString( cipher.doFinal(plaintext.getBytes()), Base64.DEFAULT); return […]

安全比较和简单==(=)之间的区别是什么

Github的安全webhooks页面说: 不build议使用普通的==运算符。 像secure_compare这样的方法执行“恒定时间”的string比较,这使得它可以安全地抵御常规等式运算符的某些定时攻击。 比较密码时bcrypt.compare('string', 'computed hash')我使用bcrypt.compare('string', 'computed hash') 。 是什么让这个“安全的比较”,我可以使用Node中的标准crypto库吗?

如何做到这一点PKCS7签署node.js?

所以我将一个ruby库移植到node.js,并需要创build一个PKCS7签名。 以下是rubylib正在做的事情: p12_certificate = OpenSSL::PKCS12::new(File.read('some-path.c12'), self.certificate_password) x509_certificate = OpenSSL::X509::Certificate.new(File.read('some-other-path.pem')) flag = OpenSSL::PKCS7::BINARY|OpenSSL::PKCS7::DETACHED signed = OpenSSL::PKCS7::sign(p12_certificate.certificate, p12_certificate.key, File.read('some-manifest'), [x509_certificate], flag) 我如何在节点中实现相同的function? 我认为这将是像这样的: crypto.createCredentials({ pfx : fs.readFileSync('some-cert.p12'), passphrase : this.certificate_password, cert : fs.readFileSync('some-path.pem','some-encoding'), }) 问题: 这是正确的方法吗? 我是否需要指定密钥,ca列表,crl列表或密码列表? 我应该用什么编码来读取证书? 什么是signed的线路设置相当于节点 什么是signed.to_der等价节点

使用Node.js,Express和Trialpay进行HMAC MD5validation

我试图validation使用Node.js和Express从TrialPay发送的消息。 TrialPay使用HMAC-MD5哈希签名请求,并提供有关validation的说明 。 这是我的代码: app.post('/trialpay', function(req, res) { var key = "[MY MERCHANT KEY]"; var hash = req.header("TrialPay-HMAC-MD5"); var data = req.body.toString(); var crypted = require("crypto").createHmac("md5", key) .update(data) .digest("hex"); if (hash == crypted) { res.writeHead(200, {"Content-Type": "plain/text"}); res.end("Success!"); } else { throw new Error("Invalid TrialPay Hash"); } }); 这显然不起作用(散列不匹配)。 免责声明:我对Node.js非常陌生,并没有什么Javascript的经验,首先。 UPDATE 我没有意识到这个链接是受保护的。 TrialPay使用您的通知密钥(在您的账户信息中设置)作为签署HMAC的密钥。 对于GET请求,问号后面的查询string(在URL中)被签名。 对于POST请求,整个POST正文都被签名。 […]

升级到NodeJS后密钥长度无效6

以下用于encryption和解密对我们的支付网关服务的请求的代码在Node Js 5.7.0中正常工作 function Encrypt(plainText, workingKey) { var m = crypto.createHash('md5'); m.update(workingKey); var key = m.digest('binary'); var iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'; var cipher = crypto.createCipheriv('aes-128-cbc', key, iv); var encoded = cipher.update(plainText, 'utf8', 'hex'); encoded += cipher.final('hex'); return encoded; }; function Decrypt(encText, workingKey) { var m = crypto.createHash('md5'); m.update(workingKey) var key = m.digest('binary'); var iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'; […]