3

我正在尝试使用表单将文件上传到使用Meteor的 s3 存储桶。我正在关注这篇亚马逊文章。在接近结尾的“签署您的 S3 POST 表单”处,我需要将字符串编码为 base64,但我一直无法找到执行此操作的方法。谁能告诉我该怎么做?请注意,首先需要对字符串进行编码然后签名。这就是它在python中的完成方式:

import base64
import hmac, hashlib

policy = base64.b64encode(policy_document)
signature = base64.b64encode(hmac.new(AWS_SECRET_ACCESS_KEY, policy, hashlib.sha1).digest())
4

3 回答 3

9

你可以在没有 NodeJS 加密模块的情况下做到这一点,创建一个包对我来说有点像打破了车轮上的苍蝇,所以我想出了这个:

if (Meteor.isServer) {
  Meteor.methods({
    'base64Encode':function(unencoded) {
      return new Buffer(unencoded || '').toString('base64');
    },
    'base64Decode':function(encoded) {
      return new Buffer(encoded || '', 'base64').toString('utf8');
    },
    'base64UrlEncode':function(unencoded) {
      var encoded = Meteor.call('base64Encode',unencoded);
      return encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
    },
    'base64UrlDecode':function(encoded) {
      encoded = encoded.replace(/-/g, '+').replace(/_/g, '/');
      while (encoded.length % 4)
        encoded += '=';
      return Meteor.call('base64Decode',encoded);
    }
    console.log(Meteor.call('base64Encode','abc'));
});

这是基于 John Hurliman 在https://gist.github.com/jhurliman/1250118上找到的 base64.js 请注意,这在服务器上就像一个魅力,但是为了将它移植到客户端,您已经调用了方法将结果存储为会话变量的回调函数。

于 2013-08-31T16:09:56.017 回答
2

您需要 NodeJS 加密模块来执行这些任务。

首先在你的流星项目的根目录下创建一个“packages”目录,然后创建一个“my-package”目录。在其中,您需要两个文件:“package.js”和“my-package.js”。

package.js 应该看起来像:

Package.describe({
    summary:"MyPackage doing amazing stuff with AWS."
});


Package.on_use(function(api){
    // add your package file to the server app
    api.add_files("my-package.js","server");
    // what we export outside of the package
    // (this is important : packages have their own scope !)
    api.export("MyPackage","server");
});

my-package.js 应该看起来像:

var crypto=Npm.require("crypto");

MyPackage={
    myFunction:function(arguments){
        // here you can use crypto functions !
    }
};

您可能需要的功能是crypto.createHmac。这是我如何在 base64 中编码 JSON 安全策略然后使用它在我自己的应用程序中生成安全签名的示例代码:

encodePolicy:function(jsonPolicy){
    // stringify the policy, store it in a NodeJS Buffer object
    var buffer=new Buffer(JSON.stringify(jsonPolicy));
    // convert it to base64
    var policy=buffer.toString("base64");
    // replace "/" and "+" so that it is URL-safe.
    return policy.replace(/\//g,"_").replace(/\+/g,"-");
},
encodeSignature:function(policy){
    var hmac=crypto.createHmac("sha256",APP_SECRET);
    hmac.update(policy);
    return hmac.digest("hex");
}

这将允许您在 Meteor 应用程序的服务器端调用 MyPackage.myFunction。最后但不是最后,不要忘记“流星添加我的包”才能使用它!

于 2013-08-27T16:21:58.523 回答
2

您可以使用meteor-crypto-base64包。

CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse('Hello, World!'));
//"SGVsbG8sIFdvcmxkIQ=="
于 2014-09-10T10:25:07.003 回答