存档

作者存档

正则表达式

2018/02/18 4,184

正则表达式为高级的文本模式匹配、抽取、与/或文本形式的的搜索与替换功能提供基础。简单地说,它可以匹配多个字符串。

符号

择一匹配、任意匹配

  • | 择一匹配,表示从多个模式中选择其中一个 ,如 at | home 既可以匹配 at, 也可以匹配 home
  • . 任意匹配,表示匹配除了换行符 \n 以外的任何一个字符

边界匹配

  • ^ $ 用于匹配行的开头和结尾
  • \b 用于匹配字符边界。\B 则与之相反。如 \bthe 匹配任何以 the 起始的单词,\Bthe 匹配任何不以 the 起始的单词

字符集

继续阅读

跨平台的命令行参数工具 — boost program_oprations

2018/02/16 4,961

1 例子

下例展示了 program_oprations 的基本用法:为程序定义了 3 个参数: help, host, port . 其中 host 与 port 分别定义了简写 h ,p 。host 是必填项, port 是有缺省值(80)的选填项,当 port 有输入时使用输入项,否则使用缺省值 ,当输入了错误的参数时会输出错误信息。

测试效果:

progma_options 库由三部分组成:

  • descrition , 描述组件,用于描述允许的参数及这些参数的值。
  • parser , 解析组件,用于解析输入的参数与值
  • storage , 存储组件, 它将解析器的输出转换成 字符串表示的健与 C++ 类型的值的 map, 并提供了访问这些值的接口。

对于上例来说, program_options 所做的事情,就是使用 options_description 描述了我们期望的参数,使用 parse_command_line 解析了输入参数并使用 store 将参数存储在 variables_map 中。当我们需要使用某个参数时直接从 variables_map 中获取。

继续阅读

CMake 使用札记

2018/01/20 4,938

本篇记录在使用 CMake 中遇到的一些问题及解决办法

参考资料:

继续阅读

解决 vs 无法 “附加到进程” 调试的问题 (msvsmon unexpectedly exited)

2018/01/02 5,305

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

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

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

"%USERPROFILE%\.dnx\bin"    或

"%USERPROFILE%\.dnx"

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

 

Qt 添加或删除组件

2017/12/27 6,513

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的在线维护更新

服务端用户密码的管理

2017/12/12 4,288

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

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

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

  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 运算,将哈希值预存储在一个或多个表里。

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

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

加盐

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

Linux bash 的小技巧

2017/11/29 4,844

路径跳转

  • cd - 快速回到前一个路径
  • cd / cd ~ 回到用户的home目录

命令参数

  • $*: 代表所有参数,其间隔为IFS内定参数的第一个字元
  • $@: 与*星号类同。不同之处在於不参照IFS
  • $#: 代表参数数量
  • $?: 执行上一个指令的返回值
  • $-: 最近执行的foreground pipeline的选项参数
  • $$: 本身的Process ID
  • $!: 执行上一个背景指令的PID
  • $_: 显示出最後一个执行的命令

继续阅读

JavaScript中的数据类型转换

2017/10/03 4,522

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

1 字符串 to 数值

显式转换

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

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

隐式转换

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