支付宝RSA私钥及公钥生成

  • Linux用户(以Ubuntu为例)$ openssl 进入OpenSSL程序

    OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥

    OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt Java开发者需要将私钥转换成PKCS8格式

    OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥

    OpenSSL> exit ## 退出OpenSSL程序

  • Windows用户在cmd窗口中进行以下操作:C:\Users\Hammer>cd C:\OpenSSL-Win32\bin 进入OpenSSL安装目录

    C:\OpenSSL-Win32\bin>openssl.exe 进入OpenSSL程序

    OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥

    OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt Java开发者需要将私钥转换成PKCS8格式

    OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥

    OpenSSL> exit ## 退出OpenSSL程序

注意:对于使用Java的开发者,将pkcs8在console中输出的私钥去除头尾、换行和空格,作为开发者私钥,对于.NET和PHP的开发者来说,无需进行pkcs8命令行操作。

经过以上步骤,开发者可以在当前文件夹中(Windows用户在C:\OpenSSL-Win32\bin)看到rsa_private_key.pem和rsa_public_key.pem两个文件,前者为私钥,后者为公钥。开发者将私钥保留,将公钥提交给支付宝网关,用于信息加密及解密。以下为使用OpenSSL生成的私钥文件和公钥文件示例。

  • 标准的私钥文件示例(PHP、.NET使用)
    1
    2
    3
    -----BEGIN RSA PRIVATE KEY-----
    MIICXQIBAAKBgQC+L0rfjLl3neHleNMOsYTW8r0QXZ5RVb2p/vvY3fJNNugvJ7lo4+fdBz+LN4mDxTz4MTOhi5e2yeAqx+v3nKpNmPzC5LmDjhHZURhwbqFtIpZD51mOfno2c3MDwlrsVi6mTypbNu4uaQzw/TOpwufSLWF7k6p2pLoVmmqJzQiD0QIDAQABAoGAakB1risquv9D4zX7hCv9MTFwGyKSfpJOYhkIjwKAik7wrNeeqFEbisqv35FpjGq3Q1oJpGkem4pxaLVEyZOHONefZ9MGVChT/MNH5b0FJYWl392RZy8KCdq376Vt4gKVlABvaV1DkapL+nLh7LMo/bENudARsxD55IGObMU19lkCQQDwHmzWPMHfc3kdY6AqiLrOss+MVIAhQqZOHhDe0aW2gZtwiWeYK1wB/fRxJ5esk1sScOWgzvCN/oGJLhU3kipHAkEAysNoSdG2oWADxlIt4W9kUiiiqNgimHGMHPwp4JMxupHMTm7D9XtGUIiDijZxunHv3kvktNfWj3Yji0661zHVJwJBAM8TDf077F4NsVc9AXVs8N0sq3xzqwQD/HPFzfq6hdR8tVY5yRMb4X7+SX4EDPORKKsgnYcur5lk8MUi7r072iUCQQC8xQvUne+fcdpRyrR4StJlQvucogwjTKMbYRBDygXkIlTJOIorgudFlrKP/HwJDoY4uQNl8gQJb/1LdrKwIe7FAkBl0TNtfodGrDXBHwBgtN/t3pyi+sz7OpJdUklKE7zMSBuLd1E3O4JMzvWP9wEE7JDb+brjgK4/cxxUHUTkk592
    -----END RSA PRIVATE KEY-----
  • PKCS8处理后的私钥文件示例(Java使用)
    1
    2
    3
    -----BEGIN PRIVATE KEY-----
    MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN0yqPkLXlnhM+2H/57aHsYHaHXazr9pFQun907TMvmbR04wHChVsKVgGUF1hC0FN9hfeYT5v2SXg1WJSg2tSgk7F29SpsF0I36oSLCIszxdu7ClO7c22mxEVuCjmYpJdqb6XweAZzv4Is661jXP4PdrCTHRdVTU5zR9xUByiLSVAgMBAAECgYEAhznORRonHylm9oKaygEsqQGkYdBXbnsOS6busLi6xA+iovEUdbAVIrTCG9t854z2HAgaISoRUKyztJoOtJfI1wJaQU+XL+U3JIh4jmNx/k5UzJijfvfpT7Cv3ueMtqyAGBJrkLvXjiS7O5ylaCGuB0Qz711bWGkRrVoosPM3N6ECQQD8hVQUgnHEVHZYtvFqfcoq2g/onPbSqyjdrRu35a7PvgDAZx69Mr/XggGNTgT3jJn7+2XmiGkHM1fd1Ob/3uAdAkEA4D7aE3ZgXG/PQqlm3VbE/+4MvNl8xhjqOkByBOY2ZFfWKhlRziLEPSSAh16xEJ79WgY9iti+guLRAMravGrs2QJBAOmKWYeaWKNNxiIoF7/4VDgrcpkcSf3uRB44UjFSn8kLnWBUPo6WV+x1FQBdjqRviZ4NFGIP+KqrJnFHzNgJhVUCQFzCAukMDV4PLfeQJSmna8PFz2UKva8fvTutTryyEYu+PauaX5laDjyQbc4RIEMU0Q29CRX3BA8WDYg7YPGRdTkCQQCG+pjU2FB17ZLuKRlKEdtXNV6zQFTmFc1TKhlsDTtCkWs/xwkoCfZKstuV3Uc5J4BNJDkQOGm38pDRPcUDUh2/
    -----END PRIVATE KEY-----
  • 公钥文件示例
    1
    2
    3
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
    -----END PUBLIC KEY-----

2.3.3.上传公钥

将公钥文件去除头尾、换行和空格,仅需填入字符串,例如转换前公钥pem文件格式:

1
2
3
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
-----END PUBLIC KEY-----

转换后得到的字符串为:

1
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB

升级linux内核

linux内核官网: www.kernel.org  获取最新内核
目前最新稳定版: wget -c https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.5.2.tar.xz
安装编译环境: yum install -y gcc gcc-c++ ncurses-devel openssl-devel

tar.xz 文件解压
xz -z 压缩
xz -d 解压

这里需要在系统原有的内核配置文件的基础上建立新的编译选项,所以复制一份之前的配置文件到内核源码目录下,命名为.config。
[root@localhost ~]# cp /boot/config-3.10.0-327.el7.x86_64 linux-4.5.2/.config

选择NTFS写入支持:
[root@localhost linux-4.5.2]# make menuconfig 这一步会读取之前复制过来的.config文件内容并做为初始值,在此基础加新的模块。
截图略:
File systems —>DOS/FAT/NT Filesystems —> 按空格选中 [*] NTFS write support 通过TAB切换选择save,根据提示一路保存

生成内核文件:
[root@localhost linux-4.5.2]# make bzImage
[root@localhost linux-4.5.2]# make modules
[root@localhost linux-4.5.2]# make modules_install
[root@localhost linux-4.5.2]# make install

更改默认启动项为最新内核:
[root@localhost ~]# vim /boot/grub2/grub.cfg
查看当前 menuentry 菜单入口
最新的为 ‘CentOS Linux (4.5.2) 7 (Core)’ 通过4.5.2是内核版本确认是刚安装的新内核

[root@localhost ~]# vim /boot/grub2/grubenv 更改为最新 menuentry
屏蔽原先内容,添加:
saved_entry=CentOS Linux (4.5.2) 7 (Core)

reboot机器
[root@localhost ~]# uname -a
Linux localhost.localdomain 4.5.2 #1 SMP Wed Apr 27 22:20:39 CST 2016 x86_64 x86_64 x86_64 GNU/Linux
看到内核为最新的了。

PS:
通过runlevel命令查看当前运行级别。 grub列表按E编辑,还是single为单用户模式,按ctrl+x启动,以前6版本为按B启动。

mysql REPLACE和REPLACE INTO用法

#替换字符串  用法:REPLACE(字符串,关键词,替换内容)

SELECT REPLACE('aaaaabc','abc','ppp');

# 返回值 aaaappp

# REPLACE INTO 向表插入/更新数据,如果唯一键存在则更新全部字段否则插入,注意如果更新的字段为空,则清空字段。如果未定义列,则此列为(NULL)

插入操作:

REPLACE INTO `test1` (`id`,`name`) VALUES ('1','a'),('2','b');

 

 

插入两条数据,id是唯一键,不存在,则插入数据。

更新操作:

REPLACE INTO `test1` (`id`,`name`,`age`) VALUES ('1','a','11'),('2','b','22');

唯一键存在,则更新数据,更新id=1的name=a,age=11。更新id=2的name=b,age=22 (全部更新)

更新name字段 a=>22:

REPLACE INTO `test1` (`id`,`name`,`age`) VALUES ('1','22','11'),('2','b','22');

更新name字段 22=>aa,并且不定义age列:

REPLACE INTO `test1` (`id`,`name`) VALUES ('1','aa'),('2','b');

这里没写age列,执行以后age字段的数据都被设置为(NULL)。

mysql条件判断if和case

表结构:

#if(expr1,expr2,expr3) 表达式expr1成立(为真),则结果为expr2,否则为expr3

SELECT IF(`name`='user1', 'user1','user2') AS `result`
FROM `a`
WHERE `id` = 1;

#返回值 user1

SELECT IF(`name`='user1', 'user1','user2') AS `result`
FROM `a`
WHERE `id` = 2;

#返回user2

#嵌套

SELECT IF(`name`='user3','user3',IF(`name`='user1', 'user1','user2')) AS `result`
FROM `a`
WHERE `id` = 3;

#返回user3

#CASE表示函数开始,END表示函数结束。当有一个成立之后,后面的就不执行了。

SELECT
CASE
 WHEN `name` = 'user1'
 THEN 'user1'
 WHEN `name` = 'user2'
 THEN 'user2'
 WHEN `name` = 'user3'
 THEN 'user3'
 ELSE 'unknow'
END AS `rs`
FROM `a` WHERE `id` = 3;

#简单写法 类似php的switch

SELECT
CASE `name`
 WHEN 'user1' THEN 'user1'
 WHEN 'user2' THEN 'user2'
 WHEN 'user3' THEN 'user3'
 ELSE 'unknow'
END AS `rs`
FROM `a` WHERE `id` = 1;

需要注意的是,如果where条件指定的字段没有这条数据的时候,case不执行,不会返回unknown。

mysql拼接字符串 CONCAT()和CONCAT_WS()函数

表结构:

# CONCAT()函数用于将多个字符串连接成一个字符串,返回结果为连接参数产生的字符串

SELECT CONCAT('https://www.rootop.org/user.php?id=',`id`,'&type=user') AS `user`
FROM `a`
WHERE `id` = 2;

#返回值 https://www.rootop.org/user.php?id=2&type=user

#如有任何一个参数为NULL ,则返回值为 NULL。

SELECT CONCAT('https://www.rootop.org/user.php?id=',`id`,NULL,'&type=user') AS `user`
FROM `a`
WHERE `id` = 2;

#返回值 (NULL)

#如果是个空字符串,没有空格,返回正常

SELECT CONCAT('https://www.rootop.org/user.php?id=','', `id`) AS `user`
FROM `a`
WHERE `id` = 2;

#返回值 https://www.rootop.org/user.php?id=2

#如果有空格,就会显示出空格符

SELECT CONCAT('https://www.rootop.org/user.php?id=',' ', `id`) AS `user`
FROM `a`
WHERE `id` = 2;

#返回值 https://www.rootop.org/user.php?id= 2 2前面有个空格

#CONCAT_WS() 代表 CONCAT With Separator 第一个参数是分隔符。执行结果,分隔符会在两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。

SELECT CONCAT_WS(':','user2的id为',`id`,'类型是user') AS `content`
FROM `a`
WHERE `id` = 2;

#返回值 user2的id为:2:类型是user

#CONCAT()和CONCAT_WS()嵌套使用

SELECT CONCAT('分析开始···',CONCAT_WS(',',CONCAT_WS(':','user2的id为',`id`),'类型是user'),'···分析结束') AS `content`
FROM `a`
WHERE `id` = 2;

#返回值 分析开始···user2的id为:2,类型是user···分析结束