JavaScript中的数据类型转换

2017/10/03

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

1 字符串 to 数值

显式转换

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

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

隐式转换

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

计算信息的指纹–单向散列函数

2017/09/20

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 年被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它是不安全的。
阅读全文…

gyp 使用参考

2017/08/11

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 文件 :

常用配置项

  • 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) 列表变量

阅读全文…

Note 122

鸡蛋的两种吃法 : 字节顺序

2017/07/24

1 字节顺序

鸡蛋有几种吃法?也许你从未注意。Jonathan Swift 的小说 Gulliver’s Travels 描写了这么一个故事: Lilliput 国的皇帝因按古法打鸡蛋时弄破的手指,于是下令全体臣民吃鸡蛋时必须先打破鸡蛋较小的一端(little-endian)。但百姓这对项命令本极度反感,并为此发动叛乱。

在计算机时代,计算机网络的开创者之一, Danny Cohen 开始使用 Swift 的小说中的词语 大端、小端 来描述字节的顺序,大小端这一术语开始被人们所接纳。 在计算机时代的远古时期,计算机刚被发明的时候,由于不能统一规则,对多字节对象在存储器上的存储方式有两种不同的方式。但它们有一个共识,即,多字节的对象都被存储为连续的字节序列,而对象的地址则这段连续序列中的最小的字节的地址。

例如,一个 int 类型的变量 n 的地址为 0x100,即 &n == 0x100,那么 n 将被存储在 0x100,0x101,0x102,0x103 这段位置。 假定有一个 w 位的整数,其 位 表示为 [bw-1, bw-2, … ,b1, b0] , 其中 bw-1 为最高位,b0 为最低位。这些位按每 8 位,即一个字节分组, 表示为 [Bx-1, Bx-2, … , B1, B0] ,其中 Bn = [bn*8-1, bn*8-2, … , bn*8-8] 。 有的机器选择选择在存储器按照从低字节到高字节的顺序来存储,这种方式称为 小端法(little-endian) ,基本所有的 Intel 机器都采用这种方式。而别一部分机器则选择按照高字节到低字节的方式来存储,称为 大端法(big-endian) ,大部分 IBM 和 Sun 的机器都采用这种规则。

所以,当一段数据从使用小端规则的机器传送到使用大端规则的机器上时,数据是无法正确解析的。除非明确的告诉计算机,这段数据需要使用哪种规则来解析。这计算机网络发明以后,这种不兼容的带来的负面作用显得尤为突出。于是一个规则产生了,在网络传输过程中,数据的发送方必须将多字节数据转换成大端法表示后再发送。而数据的接收方则需要按照大端法来解析多字节数据,再转换为它的内部表示。这样,在网络中,终端只关心本机的字节序与网络字节序,而不用关心网络另一端的机器使用什么样的字节充。所以又将大端法称为 网络字节序 ,以区分 本机字节序

阅读全文…

对称密码的模式(MODE)

2017/07/16

1 科谱:密码学中的常见概念

1.1 密钥

根据密钥的使用方法,可以将密钥分为两种:

  • 对称密钥 是指在加密和解密时使用同一密钥的方式
  • 公钥 加密和解密使用的不是同一种密钥,也称 非对称密钥

1.2 单向散列

单向散列是由单向散列函数计算出来的一组数值。它不能保证数据的机密性,是用来保证数据的完整性的。例如,有安全意识的软件发布者会向用户公布软件的散列值,一般是 MD5. 可以通过检验软件的 MD5 散列值,判断软件是否被篡改过。

1.3 随机数

随机数可以通过硬件生成,也可以通过软件来生成。通过硬件生成的随机数列,是根据传感器收集的热量、声音的变化等事实上无法预测和重现的自然现象信息来生成的,可以称为 真随机数 . 而一般由软件生成的随机数是可以周期性重现的,这种随机数称为 伪随机数 。生成随机数的软件叫做 伪随机数生成器

2 对称加密

常用的对称加密方法有 DES 与 AES 两种。

2.1 DES

DES 是一种将 64bit 的明文加密成 64bit 密文的对称密钥算法,它是密钥长度也是 64bit,但是它的密钥每隔 7bit 会设置一个用于错误检查的 bit, 所以实质上其密钥长度是 56bit . 因为 DES 每次只能加密 64bit 明文,所以需要对超过 64bit 的明文进行分组。以分组为单位进行处理的密码算法也称为 分组密码 。分组后的明文以什么样的方式进行加密,我们称之为 模式(mode) 。 DES 的基本结构以其设计者的名字(Horst Feistel)命名,也称 Feistel 网络可 Feistel结构。在 Feistel 结构中,将 64bit 明文再分作两部分,每部分 32bit。假如标记为 A B 两部分,那么有如下步骤:

  1. 对 B 使用子密钥 subkey 进行加密运算,生成 Bf(B,subkey) = B'
  2. B~ 与 A 进行异或运算,生成 C : B' XOR A = C
  3. C 与 B 组合,生成密文 D : C # B = D

这三个步骤称为一个 轮(round) .可以看到,密文D的后半部分 B 没有被加密。我们将组成 D 的 C 与 B 部分进行互置,即令 A = B, B = C,再重复上面的步骤 1 ~ 3 ,这样明文的每一个部分都被加密了。 DES 就是一种由 16 个轮循环组成的 Feistel 网络。每一轮都会生成一个不同的密钥,所以称为子密钥。

2.2 3DES

DES 可以在有限时间内被暴力破解。三重DES 作为 DES 的代替品产生了。三重DES 是为了增加 DES 的强度,将 DES 算法重复 3 次所得到的一种密码算法。也叫 TDEA(Triple Date Encryption Algorithm), 也简写作 3DES ,或 DES3 . 需要注意的,3DES 并不是将 DES 加密过程重复3将,而是将 DES 算法重复 3 次,其过程是:

  1. 使用密钥 K1 对明文进行 DES 加密
  2. 使用密钥 K2 对步骤1 产生的密文进行解密
  3. 使用密钥 K3 对步骤2 产生的 “明文” 进行加密

这一过程是由 IBM 公司设计出来的,其目的是为了兼容 DES 算法:如果这 3 个步骤使用了相同的密钥,那么其加密就与 DES 完全相同了。 如果步骤1 和步骤3 使用相同的密钥,而步骤2 使用不同的密钥,这种三重 DES 称为 DES-EDE2, EDE 表示 Encryption-Decryption-Encryption。 而正是由于 3DES 特别重视向下兼容,导致其效率低且不够安全,所以在实际中很少被使用。

2.3 AES

AES (Advanced Encryption Standard) 是取代 DES 成为新标准的一种对称密钥算法。全世界的科学家提交了多个对称密钥算法为在AES 的候选,而最终在 2000年, 从这些候选算法中先出一种名为 Rijhdeal 的对称密码算法,将其确定为 AES 算法。 和 DES 一样, AES(Rijndeal) 也是由多个 轮构成的,不过不是 Feistel 结构 ,而是 SPN 结构,每一轮分为为 SubBytes, ShiftRows, MixColumns 和 AddRoundKey 4 个步骤

 

3 分组模式

前面提到的 DES 和 AES 都只能加密固定长度的明文,如果需要加密任意长度的明文,就需要对分组密码进行迭代,这个迭代的方法就是所谓的 “模式”。分组密码的主要模式有如下 5 种:

  • ECB Electronic CodeBook mode (电子密码本)
  • CBC Cipher Block Chaining mode (密码分组链接)
  • CFB Cipher FeedBack mode (密码反馈)
  • OFB Output FeedBack mode (输出反馈)
  • CTR CounTeR mode (计数器)

3.1 ECB 模式

将明文分组直接加密的方式就是 ECB 模式。这种模式很简单,但通常不会被使用。在 ECB 模式中,明文分组成密文分组是一一对应的,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都将被转换为相同的密文分组,只要观察密文就可以知道明文中存在怎么的组合,并以此为线索来破译密码。

 

阅读全文…

git 使用笔记 (不定期更新中)

2017/06/24

子模块 (Submodule)

添加

git submodule add [remotegiturl] [localdir]

更新

git submodule update --init --recursive

clone 时更新子模块

git clone [remotegiturl] --resuresive

远程更新(更新到最新)

submodule 不会detach到源的任何一个分支,而只是源的某一个commit,
使用 git submodule update --remote
将本地的子模块更新到最新。如果需要将远程仓库的子模块了更新到最新,可以先更新本地,再push到远程仓库:

删除

git 没有提供删除子模块的命令

 

分支(branch)

git 仓库在创建的时候默认会创建一个 master 分支

创建分支

git branch [branch_name]
会创建一个新的分支。此时仍然工作在原分支上,而不会自动切换到新创建的分支上。git 对分支的名称有一些限制:

  • 可以包含斜杠(/),但不能以斜杠(/) 开头或结尾
  • 不能以点号(.), 减号(-) 开头, 点号也不能紧跟在斜杠后面,并且不能出现连接的两个点号。如 feature/.new ,feature..new 都是非法的
  • 不能包含任何空白字符(如空格,tab)
  • 不能包含在 git 中具有特殊意义的字符。包括 ~, ^ , : , ? , * , [
  • 不能包含任何 ASCII控制字符,即值小于八进制 \040 的字符或 DEL(八进制\177)

查看分支

  • git branch 当后面不跟任何参数时,显示本地所有的分支,并对当前分支做特殊标识。
  • git branch -r 会查看远程分支
  • git branch -a 会将本地分支和远程分支都列出来
  • git show-branch 另一个命令可以查看更详细的内容:输出分为两个部分,使用减号分隔。

    减号的个数是同分支的个数决定的,有多少个分支就有多少个 ‘-‘ 。
    上半部分显示所的有分支。当前分支使用 ‘*’,其他分支分别使用不同颜色的 ‘!’ 标识。颜色没有特殊的意义,只是用来区分不同的分支而已;
    下半部分显示 commit 列表。每个列表使用 ‘*’ 和不同颜色的 ‘+’ 表示。这里的颜色和上半部分 ‘!’ 相对应,表示该分支上有此 commit 

阅读全文…

Note 84