豌豆

没有荚

The debugger’s worker process (msvsmon.exe) unexpectedly exited. Debugging will be aborted

在 vs “附加到进程” 进行调试时,总是弹出如上错误。偶尔还会造成 vs crash。

检查环境变量,看一下 path 变量下是否有

“%USERPROFILE%.dnx\bin” 或

“%USERPROFILE%.dnx”

的值。如果有则删除之并重启。

Qt 安装后,需要添加或删除组件,会比较麻烦。步骤如下:

  1. Qt 安装目录里找到 MaintenanceTool.exe ,运行并登录

  2. 添加或删除组件 -> Next , 会出现 要继续此操作,至少需要一个有效且已启用的储存库 。它表示Qt 无法从本地文件更新,需要联网更新。
    存储库 可以在 存储库镜像列表 找到全世界的镜像节点 ,其中有3个位于中国,分别是北京理工、清华与北京科技大学安节点。选择其中一个,点击 HTTP 标签 ,在打开的文件列表中找到相应存储库的位置,如 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qt5/windows/x86/online_repository/

  3. 打开 MaintenanceTool 的 设置选项卡,将上面的镜像地址添加到用户定义储存库,即可进行QT的在线维护更新

最近做了一些与密码学相关的工作,对于消息的加解密有了一些新的看法。结合之前项目中遇到的服务端密码存储的问题,在这里写一点自己的想法。

目前常见的一些密码存储方式

以下是一些常见的密码存储方式,其中一部分是自己用过的,一部分是见过别人使用的:

  1. 明文 pwd

  2. 经过MD5 哈希后存储 md5(pwd)

  3. 两次MD5后存储 md5(md5(pwd))

  4. 加盐md5存储 md5(pwd + salt)

  5. 密码扩展后存储 kdf(pwd)

  6. 慢哈希后存储 brypt(pwd)

  7. 以上多种算法组合后存储

哈希

很明显,第 1 种是最不安全的。存储在数据库中的密码可以轻易地被管理员看到。一旦服务器被拖库,这些密码就轻易地被别人窃取,并可以根据账号和密码在其它网站上试探(大部分用户在多个网站上使用相同的用户名和密码)。尽管人人都知道这种存储方式是极不安全的,但仍然有很多网站使用它。如前几年震惊中外的 CSDN 拖库事件 。在这一事件中,有600万用户的信息被泄漏。
第 2 种 方式比较古老,管理员和黑客无法看到用户的明文密码。但如我们所知,MD5 是不安全的。如 MD5 碰撞算法。而在此之前,查表法一直做为破解 MD5 密码的重要手段 。 所谓 查表法 ,就是对字典(密码集) 进行 MD5 运算,将哈希值预存储在一个或多个表里。

当需要破解某密码时,根据服务器存储的哈希值在预计算的哈希值表中查找对应的值。而 反向查表法 ,攻击者可以同时对多个重合密码进行攻击。

1
2
SELECT table_b.pwd, table_user.uname FROM table_user,table_b WHERE table_b.hash_val = 'hash_val_1' ;  -- 查表
SELECT table_b.pwd, table_user.uname FROM table_user,table_b WHERE table_user.hash_val = 'hash_val_x' ;. --反向查表

如果用户使用了弱密码,这种使用反向查表法来破解密码简直不要太轻松。
使用查表法需要存储字典与哈希值,对存储空间有较高的要求。后来进化出了 彩虹表 法,在算法的空间和时间上进行了优化。

加盐

第 3、4 种方式针对上述攻击方法做了改进。其实第 3 种方式并大的改进, 因为算法和参数是固定的。而第 4 种的改进比较好。所谓 加盐(salt) ,即在消息的任意固定位置添加附加消息。它使攻击者的字典变得更加复杂,攻击者计算预存储值的难度大大增加了;每个密码都混入了不同的盐,所以使得反向查表法去批量匹配密码变得难以施行。在加盐存储的实践中,有部分人使用了错误的实现:如盐值过短,或盐值重复。
盐值过短 无法对攻击者造成足够的困扰,一个好的盐值的长度起码要和哈希值的长度一至。而 盐值重复 则和未加盐没有区别:两个相同的密码加相同的盐,得到的哈希值是一样的。特别是对于那些将盐值硬编码到代码里的,简直是在为攻击者提供帮助。类似地,也不要使用用户名、用户id、创建时间等字段做为盐值–盐值应该是随机的,且并用户修改密码时应该给出新的盐值。

Read more »

路径跳转

  • cd - 快速回到前一个路径

  • cd / cd ~ 回到用户的home目录

命令参数

  • $*: 代表所有参数,其间隔为IFS内定参数的第一个字元

  • $@: 与*星号类同。不同之处在於不参照IFS

  • $#: 代表参数数量

  • $?: 执行上一个指令的返回值

  • $-: 最近执行的foreground pipeline的选项参数

  • $$: 本身的Process ID

  • $!: 执行上一个背景指令的PID

  • $_: 显示出最後一个执行的命令

Read more »

这里总结了JavaScript中常见的数据类型转换

1 字符串 to 数值

显式转换

通常的做法是使用 Number()parseInt() , parseFloat() 函数。需要注意的是, Number() 的参数不能含有非数字字符串值 ,如 Number(100x) 会得到 Nan, 而 parseInt(), parseFloat() 则是参数的第一个字符不可以是非数字,否则会得到 Nan, 而且它会忽略第一个非数字的字符串之后的所有字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
js>Number<('100x')
NaN
js>parseInt('100x')
100
js>parseFloat('100x')
100
js>parseInt('10d20x')
10
js>parseFloat('10d20x')
10
js>Number('10d20x')
NaN
js>parseInt('a10d20x')
NaN
js>parseFloat('a10d20x')
NaN
js>Number('a10d20x')
NaN

对于 parseInt() 函数来说,可以指定进制。早期版本的 JavaScript 默认执行 8 进制转换,而新版本使用 10 进制 进行转换。如果需要保证兼容性,则需要带上第二个参数:

1
2
3
4
5
6
7
8
9
10
11
12
js>parseInt('11',2)
3
js>parseInt('11',3)
4
js>parseInt('11',4)
5
js>parseInt('11',8)
9
js>parseInt('11',10)
11
js>parseInt('11',16)
17

隐式转换

数值的字符串变量(指可以通过 Number函数转换为数值的字符串,本节中的字符串均指可以通过 Number() 转换为数值的字符串) 在遇到数值运算符时可能发生隐式转换:

Read more »

坑1 :

在 Pypi 上有 pywin32 的页面 ,然后无法使用 pip 命令来安装它,只有到 Sourceforge 下载源码或安装程序

坑2:

如果你下载了源码,可以使用:

1
setup.py install

来自动编译安装。很不幸,我的windows上编译环境比较复杂( 有 vs2013/2015/2017)。 setup.py 在编译时抛出了各种环境错误。好在我有 mingw,使用命令:

1
setup.py build --compiler mingw32

用 mingw 来进行编译,然后被抛出错误:

1
2
win32/src/PyACL.cpp:1090:7: warning: unused variable 'pacl' [-Wunused-variable]
ACL *pacl=This->GetACL();

那么下载安装包直接进行安装吧 🙁

坑3:

我使用的是win10 64位操作系统,使用 python2.7 环境。于是下载了 pywin32-221.win-amd64-py2.7.exe 。点击安装,下一步:

仔细检查,环境变量是没有问题的。再手动选择python安装路径(只能粘贴,不可以键盘输入),还是有错误…… 查注册表,发现注册表里有一些缺失。添加注册表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7]

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\Help]

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\Help\Main Python Documentation]
@="E:\\program\\Python27\\Doc\\python2713.chm"

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\InstallPath]
@="E:\\program\\Python27\\"
"ExecutablePath"="E:\\program\\Python27\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\InstallPath\InstallGroup]
@="Python 2.7"

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\Modules]

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\PythonPath]
@="E:\\program\\Python27\\Lib;E:\\program\\Python27\\DLLs;E:\\program\\Python27\\Lib\\lib-tk"

OK ,安装成功!😏

坑4:

在 python 中运行一下:

1
>>>import win32clipboard

出现错误:ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。

摔……😡

再次检查,发现这台电脑是安装的python 是32位 版本的。再次安装 pywin32 的32位版本,这次运行成功……

🤣

1 XCodeGhost 风波

2015年9月17日左右,知名程序员唐巧发布微博声称Xcode有可能被第三方代码注入,而在社交平台上引起轩然大波。乌云网后续发布相关的知识库文章。而在此之前,腾讯安全应急响应中心在跟踪某app的bug时发现异常流量,解析后上报了国家互联网应急中心(CNCERT),后者随即在9月14日发布了预警消息。之后也有国外信息安全组织跟进调查。 受影响的应用程序包括微信、网易云音乐、滴滴打车、高德地图、12306、同花顺、中信银行动卡空间、简书等76种。而事情的起因,是有人将被添加了恶意代码的 XCode 放在百度云盘上,供开发者下载,在使用感染后的XCode发布的App都带有后门,会在最终客户端运行时将隐私信息提交给第三方。 这一事件被称为 “XCodeGhost 事件”。

事件的背后折射出的,是计算机网络信息中的安全问题。 互联网中的大部分用户,都缺乏基本的安全意识,其中就包括计算机重度使用者:程序员。 如何确保我们下载使用的软件是没有经过污染的软件呢?首先确保我们从正规的渠道获取软件,其次,我们需要对软件进行校验。比较常用的方法,是使用哈希函数进行校验。 如 Eclipse.org 为我们提供了 SHA-512 校验码

2 什么是哈希函数

哈希函数,也叫单向散列函数 (one-way hash function) ,有一个输入和一个输出,输入称为 消息 ,输出称为 散列值 ,函数根据消息计算出散列值,可以用来检验消息的完整性。它也称作 消息摘要函数 (Message Digest Function) ,或者 杂凑函数 。消息也被称作 原像 ,散列值也被称作 哈希值指纹 。哈希函数具有以下的特性:

  1. 散列值长度与消息长度无关

  2. 散列值与消息内容密切相关,即消息不同,散列值也不同

  3. 单向性 在给出散列值 H(M) 的情况下,无法计算出消息 M 的值。

  4. 抗碰撞性 如果有消息 M1,散列值 H(M1), H(M2) ,且 H(M1) = H(M2) ,很难找出消息 M2 令 M2 ≠ M1

3 常见的几种哈希函数

3.1 MD5

MD5 能够产生 128 bit 的散列值(RFC1321)。 MD5 的强抗碰撞性已经于 2005 年被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它是不安全的。

Read more »

1 步骤

  • 将 vscode 切换到 debug 视图 ( Ctrl+Shift+D )

  • 打开 launch.json

.在 configurations 节点下添加以下对象并保存

1
2
3
4
5
6
7
8
{
"type": "node",
"request": "launch",
"name": "Electron Main",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
"program": "${workspaceRoot}/main.js",
"protocol": "legacy"
}
  • 在 main.js 中添加一个断点

  • 在 vscode 中点击 “开始调试”

,命中断点,即可开始调试。

2 变量

在 launch.json 中有一些预定义的变量:

  • ${workspaceRoot} VSCode 打开的文件夹目录路径

  • ${workspaceRootFolderName} 根路径文件夹名称

  • ${file} 当前打开的文件

  • ${relativeFile} 当前打开文件相对于 workspaceRoot 的相对路径

  • ${fileBasename} 当前打开文件的文件名

  • ${fileBasenameNoExtension} 不带扩展名的文件名

  • ${fileExtname} 当前打开文件的扩展名

  • ${fileDirname} 当前打开文件的文件夹名称

  • ${cwd} 运行任务的工作路径

  • ${lineNumber} 当前文件的选择行

除了这些预定义的变量,还可以使用

  • ${env:Name} 来使用环境变量,如 ${env:PATH}

  • ${config:Name} 来使用 VSCode 的设置,如 ${config:editor.fontSize}

  • ${command:CommandID} 来执行命令行,如 ${command:explorer.newFolder} (windows)

3 不同操作系统的配置

launch.js 还支持对不同的操作系统作特殊配置,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Main Process",
"type": "node",
"request": "launch",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
"windows": {
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd"
},
"args" : ["."]
}
]
}

对于 runtimeExecutable 节点, windows 操作系统使用 electron.cmd 文件,而其它操作系统使用 electron 操作系统分别定义为: windows , linux , osx 三种。

gyp 官网

Generate Your ProjectsGenerate Your Projects (可能需要梯子)

gyp 命令

  • --depth 据说是Chromium历史遗留问题,需要设置为 --depth=.

  • -f 指定生成工程文件的类型,选项有: make ninja xcode msvs scons

  • -G 指定 vs 版本 msvs_version=2013

  • -D 传入变量到 gyp。传入的变量可以在gyp内使用 <(VAR) 获取

  • --toplevel-dir 设置源代码的根目录,默认为depth设置的目录

执行 shell 命令

gyp 可以将 shell 命令的结果返回给变量,语法为 <!(cmd)<!@(cmd) ,前者返回 string ,后者返回 list.
如使用 ls 命令在 source 中添加所有的 .h 文件 :

1
2
3
'source': [
'<!@(ls -l ./*.h)',
]

常用配置项

  • defines 宏定义 ,对应 -D ,如 -D_DEBUG

  • include_dirs 头文件地址, 对应 -I

  • cflags 编译选项, 如 -g -O3

  • ldflags 链接选项, 对应 -l ,如 -lpthread -lsqlite3

  • type 目标类型 有 executable ,static_library ,shared_library

变量

变量分为两类,预定义变量、自定义变量

预定义变量

这些变量名称为gyp内置,一般为 大写或(或)下划线 组成:

  • OS 操作系统,如 OS == "win"

  • EXECUTABLE_PREFIX 可执行文件的前缀

  • EXECUTABLE_SUFFIX 可执行文件的后缀

  • PRODUCT_DIR 编译出的目标文件的目录

  • INTERMEDIATE_DIR 中间文件目录(只对单一 target 有效)

自定义变量

variables 用于自定义变量。自定义的变量可以使用以下方式使用:

  • <(VAR) 变量

  • <@(VAR) 列表变量

Read more »
0%