小编iRy*_*ell的帖子

使用Diffie-Hellman密钥交换和AES通过HTTP进行客户端加密

Diffie-Hellman Key Exchange上观看YouTube视频后,我想尝试用JavaScript实现(Atwood定律).

我使用以下规则在Node.js上绘制了一个密码:

  • 第1步:客户端和服务器就共享密钥达成一致:

    • 客户端和服务器以512位主公钥pK开头

    • 客户端生成512位主要私钥kC并发送powMod(3,kC,pK)

    • 服务器生成512位主要私钥kS并发送powMod(3,kS,pK)

    • 客户端和服务器使用powMod(响应,私钥,pK)作为共享密钥

  • 第2步:沟通

    • 在客户端发送数据之前,使用Stanford Javascript加密库(256位AES,HMAC身份验证,PBKDF2密码加密和CCM身份验证加密)使用共享密钥对其进行加密.

    • 一旦服务器使用共享密钥解密数据,它就会生成一个新的512位主要私钥,并将其作为SJCL加密响应发送.

    • 客户端和服务器使用powMod切换到新的共享密钥(3,prevSharedKey,newPrivKey)

现在我有几个问题..

与HTTPS或其他算法相比,这样的系统有多安全?这种系统最薄弱的地方是什么?

在安全性/实用性方面,使用1024位密钥以提高安全性会更好吗?HMAC/PBKDF2/CCM选项是否过度杀伤?是否值得调整共享密钥?谢谢阅读!

javascript encryption aes node.js diffie-hellman

11
推荐指数
2
解决办法
1万
查看次数

禁用404错误记录

在我的配置中,我正在使用:

error_page  404  /switch;
Run Code Online (Sandbox Code Playgroud)

当我浏览/ testABC时,我在日志中看到此错误:

open() "/usr/local/nginx/html/www/testABC" failed (2: No such file or directory)
Run Code Online (Sandbox Code Playgroud)

如何禁用此错误?我目前正在使用404作为网站功能的一部分.

nginx

11
推荐指数
1
解决办法
1万
查看次数

我的nginx + fastcgi配置下载php文件而不是执行它们

我在ubuntu 13.04上全新安装php5-fpm和nginx时使用此配置:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    server_name localhost;

    location / {
            try_files $uri $uri/ /index.html;
    }

    location /doc/ {
            alias /usr/share/doc/;
            autoindex on;
            allow 127.0.0.1;
            allow ::1;
            deny all;
    }

    error_page 404 /404.html;

    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

            # With php5-cgi alone:
            fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我的Web浏览器将php视为文本而不是执行结果.我应该在哪里进行故障排除?

fastcgi nginx

10
推荐指数
1
解决办法
2万
查看次数

防止谷歌地图窃取键盘输入

在此文本字段中,您可以在contenteditable字段中键入"k"和"m",它们会正确显示.

http://jsfiddle.net/MNsBK/

keyboardShortcuts: false // Doesn't work
Run Code Online (Sandbox Code Playgroud)

但是,如果你拖动背景,你将失去输入'm'或'k'的能力.如何阻止谷歌地图抓取这些键盘键('k'和'm')?

google-maps

9
推荐指数
1
解决办法
618
查看次数

将Lua中每个单词的首字母大写

我可以使用以下方法将字符串的第一个字母大写:

str:gsub("^%l", string.upper)
Run Code Online (Sandbox Code Playgroud)

如何修改它以大写字符串中每个单词的第一个字母?

lua lua-patterns

9
推荐指数
1
解决办法
5739
查看次数

node.js上的jsdom + canvas:toDataURL()错误

使用canvas@1.2.3和jsdom@3.1.2与节点v0.12.2,我在尝试使用canvas toDataURL()函数时遇到错误.

canvasTest.js:

$(function(){
  var canvas = $('<canvas></canvas>').attr({'id':'canvasTest', 'width':'500', 'height':'500'});

  var ctx=canvas[0].getContext("2d");
  ctx.beginPath();
  ctx.arc(100,75,50,0,2*Math.PI);
  ctx.stroke();

  $('#canvasWrap').append(canvas);
});
Run Code Online (Sandbox Code Playgroud)

HTML测试:

<!doctype html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="canvasTest.js"></script>
<script type="text/javascript">
$(function(){
  console.log($('body').html());
  console.log($('#canvasTest').length);
  console.log($('#canvasTest')[0].toDataURL());
})
</script>
</head>
<body>
<div id="canvasWrap"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

jsdom测试:

var canvas = require('canvas');
var jsdom = require('jsdom');

jsdom.env({
  html: '<html><body><div id="canvasWrap"></div></body></html>',
  scripts: ['127.0.0.1/jquery-2.1.4.min.js','127.0.0.1/canvasTest.js'],
  done:function (err,win) {
    var $ = win.jQuery;
    $(function(){
      console.log($('body').html());
      console.log($('#canvasTest').length);
      console.log($('#canvasTest')[0].toDataURL());
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

在我在Chrome中的HTML测试中,我获得了正确的base64编码的画布数据,而在node.js中,错误如下:

TypeError: Cannot read property 'toDataURL' of undefined
Run Code Online (Sandbox Code Playgroud)

canvas node.js jsdom

9
推荐指数
1
解决办法
1206
查看次数

如何在Lua中对request_uri字符串进行urldecode

当我使用时,ngx.var.request_uri我将返回一个包含%20的字符串代替空格.是否有urldecode()函数或类似解码我的字符串?

lua nginx

8
推荐指数
2
解决办法
2万
查看次数

Apache 2.4.1未定义对`SSLv2_client_method'的引用

我之前运行的是apache 2.2.20和openssl 1.0.0e.我安装了openssl 1.0.1,然后下载了apache 2.4.1的tarball并安装了apr 1.4.6和apr-util 1.4.1 --prefix=/usr/local.我配置了apache2:

sudo ./configure --prefix=/usr/local/apache2 --enable-mods-shared=all
--enable-deflate --enable-proxy --enable-proxy-balancer --enable-proxy-http
--enable-rewrite --enable-cache --enable-mem-cache --enable-ssl --enable-headers
--with-mpm=worker --with-included-apr
Run Code Online (Sandbox Code Playgroud)

但跑完后sudo make我得到一个错误:

httpd-2.4.1/support/ab.c:2227: undefined reference to `SSLv2_client_method'
Run Code Online (Sandbox Code Playgroud)

导致此错误的原因是什么?如何更正错误?

apache openssl makefile apache2

6
推荐指数
1
解决办法
2万
查看次数

Luasocket + nginx错误 - lua条目线程中止:运行时错误:尝试跨越C调用边界

当我使用以下脚本时:

local smtp = require("socket.smtp")
local from = "from@host"
local rcpt = "rcpt@host"
local msg = {
  headers = {
    to = rcpt,
    subject = "Hi"
  },
  body = "Hello"
}
smtp.send{from = from,rcpt = rcpt,source = smtp.message(msg)}
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:lua entry thread aborted: runtime error: attempt to yield across C-call boundary.

我正在使用Lua 5.1 的最新luasocket安装,luarocks使用与LuaJIT 2.1编译的nginx.是什么导致此错误消息,我该如何解决?

lua nginx luasocket luajit luarocks

6
推荐指数
1
解决办法
2554
查看次数

使用 Node.js util 模块承诺所有方法

我有一个 redis util,看起来像:

const redis = require('redis')
const { promisify } = require('util')
const client = redis.createClient({
  host: '127.0.0.1',
  port: '6379'
})

module.exports = {
  get: promisify(client.get).bind(client),
  hget: promisify(client.hget).bind(client),
  set: promisify(client.set).bind(client),
  mset: promisify(client.mset).bind(client),
  hset: promisify(client.hset).bind(client),
  hmset: promisify(client.hmset).bind(client),
  ...
}
Run Code Online (Sandbox Code Playgroud)

我想在没有所有重复的情况下重写它。我将如何通过promisify迭代每个方法导出客户端函数?

最初,我研究Object.keys(client)Object.getOwnPropertyNames(client)作为获取要映射的方法名称的起点,但这些数组都不包含它们。

编辑:这更接近,有没有更好的表达方式?

const promisifiedClient = {}

for (const fn in Object.getPrototypeOf(client)) {
  if (typeof client[fn] === 'function') {
    promisifiedClient[fn] = promisify(client[fn]).bind(client)
  }
}

module.exports = promisifiedClient
Run Code Online (Sandbox Code Playgroud)

Edit2:也许这有效(如果它不是没有一些奇怪的promisifying函数的副作用,我可能不需要/想要promisify?)

const redisFunctionList = Object.keys(Object.getPrototypeOf(client))

const promisifiedRedis = …
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-6

6
推荐指数
1
解决办法
1781
查看次数