using System;
using System.Text;
using System.Security.Cryptography;
namespace Utility.Security
{
/// <summary>
/// DES加密/解密类。
/// </summary>
public class DESEncrypt
{
/// <summary>
/// 加密数据
/// </summary>
public static string Encrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray;
inputByteArray = Encoding.Default.GetBytes(Text);
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
return ret.ToString();
}
/// <summary>
/// 解密数据
/// </summary>
public static string Decrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len;
len = Text.Length / 2;
byte[] inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}
}
}
升级/更新 Centos 7 内核
关于内核版本的定义:
版本性质:主分支ml(mainline),稳定版(stable),长期维护版lt(longterm)
版本命名格式为 “A.B.C”:
数字 A 是内核版本号:版本号只有在代码和内核的概念有重大改变的时候才会改变,历史上有两次变化:
数字 B 是内核主版本号:主版本号根据传统的奇-偶系统版本编号来分配:奇数为开发版,偶数为稳定版
数字 C 是内核次版本号:次版本号是无论在内核增加安全补丁、修复bug、实现新的特性或者驱动时都会改变
1、查看当前系统内核版本
uname -r
3.10.0-514.el7.x86_64
2、升级内核
升级内核需要先导入elrepo的key,然后安装elrepo的yum源:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install -y https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
如果要安装ml内核,使用如下命令:
yum --enablerepo=elrepo-kernel -y install kernel-ml-devel kernel-ml
如果要安装lt内核,使用如下命令:
yum --enablerepo=elrepo-kernel -y install kernel-lt-devel kernel-lt
3、设置为默认内核
grub2-set-default 0 grub2-mkconfig -o /boot/grub2/grub.cfg
4、删除旧的内核
查看已安装的内核
rpm -qa | grep kernel
删除旧内核
yum remove 内核名称
5、安装新版本工具包(可选操作)
移除旧版本
yum remove kernel-tools-libs kernel-tools -y
安装新版本
如果安装ml版本执行:
yum --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml-tools
如果安装lt版本执行:
yum --disablerepo=* --enablerepo=elrepo-kernel install kernel-lt-tools
6、reboot
重启机器,然后查看内核版本
uname -r
5.3.8-1.el7.elrepo.x86_64
IE jscript 实现 Array.find()
由于IE 家族jscript不支持find,需要而外代码实现Array属性find的扩展
if (!Array.prototype.find) { Array.prototype.find = function (callback) { for(var i in this){ if (callback(this[i], i, this)) { return this[i]; } } return null; } }
javascript 下载 base64
function downloadBase64(base64, fileName) {
base64 = base64.replace(/.+;base64,/, '');
var byteCharacters = atob(base64);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var blob = new Blob([byteArray], { type: 'application/octet-stream' });
if (navigator.msSaveOrOpenBlob) {// if IE
navigator.msSaveBlob(blob, fileName);
} else { //if not IE
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = fileName;
link.click();
window.URL.revokeObjectURL(link.href);
}
}
javascript 实现 date format
比较好用的 js 时间格式化方法,复杂的多种格式。
Date.prototype.format = function (mask) {
var d = this;
var zeroize = function (value, length) {
if (!length) length = 2;
value = String(value);
for (var i = 0, zeros = ''; i < (length - value.length) ; i++) {
zeros += '0';
}
return zeros + value;
};
return mask.replace(/"[^"]*"|'[^']*'|\b(?:d{1,4}|m{1,4}|yy(?:yy)?|([hHMstT])\1?|[lLZ])\b/g, function ($0) {
switch ($0) {
case 'd':
return d.getDate();
case 'dd':
return zeroize(d.getDate());
case 'ddd':
return ['Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat'][d.getDay()];
case 'dddd':
return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][d.getDay()];
case 'M':
return d.getMonth() + 1;
case 'MM':
return zeroize(d.getMonth() + 1);
case 'MMM':
return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][d.getMonth()];
case 'MMMM':
return ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][d.getMonth()];
case 'yy':
return String(d.getFullYear()).substr(2);
case 'yyyy':
return d.getFullYear();
case 'h':
return d.getHours() % 12 || 12;
case 'hh':
return zeroize(d.getHours() % 12 || 12);
case 'H':
return d.getHours();
case 'HH':
return zeroize(d.getHours());
case 'm':
return d.getMinutes();
case 'mm':
return zeroize(d.getMinutes());
case 's':
return d.getSeconds();
case 'ss':
return zeroize(d.getSeconds());
case 'l':
return zeroize(d.getMilliseconds(), 3);
case 'L':
var m = d.getMilliseconds();
if (m > 99) m = Math.round(m / 10);
return zeroize(m);
case 'tt':
return d.getHours() < 12 ? 'am' : 'pm';
case 'TT':
return d.getHours() < 12 ? 'AM' : 'PM';
case 'Z':
return d.toUTCString().match(/[A-Z]+$/);
// Return quoted strings with the surrounding quotes removed
default:
return $0.substr(1, $0.length - 2);
}
});
};
javascript String 转 bytes
实现String转bytes属性扩展
String.prototype.toBytes = function () {
var ch, st, re = [];
for (var i = 0; i < this.length; i++) {
ch = this.charCodeAt(i); // get char
st = []; // set up "stack"
do {
st.push(ch & 0xFF); // push byte to stack
ch = ch >> 8; // shift value down by 1 byte
}
while (ch);
// add stack contents to result
// done because chars have "wrong" endianness
re = re.concat(st.reverse());
}
// return an array of bytes
return re;
}
Ubuntu 18.04 / CentOS 7开启Google BBR
BBR
Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也不例外。 根据实地测试,在部署了最新版内核并开启了 TCP BBR 的机器上,网速甚至可以提升好几个数量级。
开启BBR
运行 lsmod | grep bbr,如果结果中没有tcp_bbr,则先运行:
modprobe tcp_bbr
echo "tcp_bbr" >> /etc/modules-load.d/modules.conf
运行:
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
运行:
sysctl -p
保存生效。运行:
sysctl net.ipv4.tcp_available_congestion_control sysctl net.ipv4.tcp_congestion_control
若均有bbr,则开启BBR成功。
CentOS 7 源码安装 php 7.3.24
PHP (超文本预处理器)
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
安装
yum源不存在php7.x,我们可以通过源码方式安装php7.x。
1、准备编译环境
yum -y install autoconf gcc bzip2 bzip2-devel libpng libpng-devel freetype-devel gmp-devel readline-devel curl-devel libxml2-devel libjpeg-devel bison openssl-devel
以及 libzip
2、下载并解压
wget https://www.php.net/distributions/php-7.3.24.tar.bz2 \ && tar -jxf php-7.3.24.tar.bz2 \ && cd php-7.3.24
3、配置并构建 PHP。在此步骤您可以使用很多选项自定义 PHP,例如启用某些扩展等。 运行 ./configure –help 命令来获得完整的可用选项清单。 在本示例中,我们仅进行包含 PHP-FPM 和 MySQL 支持的简单配置。
./configure --prefix=/usr \ --sysconfdir=/etc/php \ --with-config-file-path=/etc/php \ --with-config-file-scan-dir=/etc/php/php.d \ --bindir=/usr/bin \ --docdir=/usr/share/doc \ --sbindir=/usr/sbin \ --libdir=/usr/lib64/php \ --with-libdir=/usr/lib64/php \ --libexecdir=/usr/libexec \ --localstatedir=/var \ --runstatedir=/run \ --includedir=/usr/include \ --localedir=/usr/local \ --datarootdir=/usr/share \ --datadir=/usr/share/php \ --mandir=/usr/share/man \ --infodir=/usr/share/info \ --enable-fpm \ --with-fpm-user=www-data \ --with-fpm-group=www-data \ --enable-mysqlnd \ --enable-mysqlnd-compression-support \ --enable-json \ --with-openssl-dir \ --with-jpeg-dir \ --with-png-dir \ --with-zlib-dir \ --with-freetype-dir \ --enable-gd-jis-conv \ --enable-ftp \ --enable-filter \ --enable-fileinfo \ --with-curl \ --with-iconv \ --with-bz2 \ --with-zlib \ --with-pcre-regex \ --with-openssl \ --enable-dom \ --with-gettext \ --with-mysqli=mysqlnd \ --enable-pdo \ --with-pdo-mysql=mysqlnd \ --with-pdo-sqlite \ --enable-simplexml \ --enable-session \ --enable-sysvsem \ --enable-sysvmsg \ --enable-sockets \ --with-libxml-dir \ --with-pear \ --enable-opcache \ --with-xmlrpc \ --with-mhash \ --with-sqlite3 \ --enable-bcmath \ --with-cdb \ --enable-exif \ --with-gd \ --with-gmp \ --enable-mbstring \ --enable-mbregex \ --enable-mbregex-backtrack \ --with-onig \ --with-readline \ --enable-shmop \ --enable-zip \ && make \ && sudo make install
4、创建配置文件,并将其复制到正确的位置。
cp php.ini-production /etc/php/php.ini \ && cp sapi/fpm/php-fpm.conf /etc/php/php-fpm.conf \ && cp sapi/fpm/www.conf /etc/php/php-fpm.d/www.conf \ && cp sapi/fpm/php-fpm.service /etc/systemd/system/php-fpm.service
5、需要着重提醒的是,如果文件不存在,则阻止 Nginx 将请求发送到后端的 PHP-FPM 模块, 以避免遭受恶意脚本注入的攻击。
将 php.ini 文件中的配置项 cgi.fix_pathinfo 设置为 0 。
打开 php.ini:
vim /etc/php/php.ini
定位到 cgi.fix_pathinfo= 并将其修改为如下所示:
cgi.fix_pathinfo=0
6、配置 php-fpm 服务
sudo systemctl start php-fpm
检查是否启动成功
sudo systemctl status php-fpm
如果出现错误:ERROR: [pool www] cannot get uid for user 'www-data'
则新建www-data 用户组:
groupadd -r www-data useradd -g www-data -s /sbin/nologin -M -r www-data
设置服务自启动
sudo systemctl enable php-fpm
本文档未涵盖对 php-fpm 进行进一步配置的信息,如果您需要更多信息,请查阅相关文档。
CentOS 7 安装 OpenSSL 1.1.1c
OpenSSL
在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
安装
1、准备编译环境
yum install gcc
2、下载OpenSSL源码
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1c.tar.gz
3、解压
tar -xzf OpenSSL_1_1_1c.tar.gz
4、配置
cd openssl-OpenSSL_1_1_1c ./config --prefix=/usr
5、编译&&安装
make && make install ldconfig
7、查看安装版本
openssl version
OpenSSL 1.1.1c 28 May 2019
JSON序列化JavaScriptSerializer
解决微软MVC请求响应的JSON的日期格式问题。需要结合StringBuilder
JavaScriptSerializer = {};
JavaScriptSerializer._charsToEscapeRegExs = [];
JavaScriptSerializer._charsToEscape = [];
JavaScriptSerializer._dateRegEx = new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\+|-)[0-9]{4})?\\)\\\\/\\"', 'g');
JavaScriptSerializer._escapeChars = {};
JavaScriptSerializer._escapeRegEx = new RegExp('["\\\\\\x00-\\x1F]', 'i');
JavaScriptSerializer._escapeRegExGlobal = new RegExp('["\\\\\\x00-\\x1F]', 'g');
JavaScriptSerializer._jsonRegEx = new RegExp('[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]', 'g');
JavaScriptSerializer._jsonStringRegEx = new RegExp('"(\\\\.|[^"\\\\])*"', 'g');
JavaScriptSerializer._init = function () {
var replaceChars = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007',
'\\b', '\\t', '\\n', '\\u000b', '\\f', '\\r', '\\u000e', '\\u000f', '\\u0010', '\\u0011',
'\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019',
'\\u001a', '\\u001b', '\\u001c', '\\u001d', '\\u001e', '\\u001f'];
JavaScriptSerializer._charsToEscape[0] = '\\';
JavaScriptSerializer._charsToEscapeRegExs['\\'] = new RegExp('\\\\', 'g');
JavaScriptSerializer._escapeChars['\\'] = '\\\\';
JavaScriptSerializer._charsToEscape[1] = '"';
JavaScriptSerializer._charsToEscapeRegExs['"'] = new RegExp('"', 'g');
JavaScriptSerializer._escapeChars['"'] = '\\"';
for (var i = 0; i < 32; i++) {
var c = String.fromCharCode(i);
JavaScriptSerializer._charsToEscape[i + 2] = c;
JavaScriptSerializer._charsToEscapeRegExs[c] = new RegExp(c, 'g');
JavaScriptSerializer._escapeChars[c] = replaceChars[i];
}
}
JavaScriptSerializer.serialize = function (object) {
var stringBuilder = new StringBuilder();
var booleanWithBuilder = function (bool, builder) {
if (typeof bool !== 'undefined') {
builder.append(bool);
} else {
builder.append('false');
}
}
var numberWithBuilder = function (number, builder) {
if (typeof number !== 'undefined' && number.toString() !== 'NaN') {
builder.append(number);
} else {
builder.append('null');
}
}
var stringWithBuilder = function (string, builder) {
builder.append('"');
if (JavaScriptSerializer._escapeRegEx.test(string)) {
if (JavaScriptSerializer._charsToEscape.length === 0) {
JavaScriptSerializer._init();
}
if (string.length < 128) {
string = string.replace(JavaScriptSerializer._escapeRegExGlobal,
function (x) { return JavaScriptSerializer._escapeChars[x]; });
}
else {
for (var i = 0; i < 34; i++) {
var c = JavaScriptSerializer._charsToEscape[i];
if (string.indexOf(c) !== -1) {
if ($.browser.opera || $.browser.mozilla) {
string = string.split(c).join(JavaScriptSerializer._escapeChars[c]);
}
else {
string = string.replace(JavaScriptSerializer._charsToEscapeRegExs[c],
JavaScriptSerializer._escapeChars[c]);
}
}
}
}
}
builder.append(string);
builder.append('"');
}
var dateWithBuilder = function (date, builder) {
if (date && date.toString() !== 'NaN') {
builder.append('"\\/Date(');
var timeOffset = date.getTimezoneOffset() * 60 * 1000;
if (timeOffset != 0) {
var time = date.getTime() - timeOffset;
builder.append(time);
}
else {
builder.append(date.getTime());
}
builder.append(')\\/"');
} else {
builder.append('null');
}
}
var plainObjectWithBuilder = function (plainObject, builder) {
builder.append('{');
var row = 0;
for (var item in plainObject) {
if (row++ > 0) {
builder.append(',');
}
stringWithBuilder(item, builder);
builder.append(':');
withBuilder(plainObject[item], builder);
}
builder.append('}');
}
var arrayWithBuilder = function (array, builder) {
if (array) {
builder.append('[');
if (array.length > 0) {
$.each(array, function (i, item) {
if (i > 0) {
builder.append(',');
}
withBuilder(item, builder);
});
}
builder.append(']');
} else {
builder.append('null');
}
}
var withBuilder = function (object, builder) {
builder = builder || new StringBuilder();
var type = $.type(object);
switch (type) {
case 'object':
if (object) {
if (jQuery.isPlainObject(object)) {
plainObjectWithBuilder(object, builder);
} else {
builder.append('null');
}
} else {
builder.append('null');
}
break;
case 'array':
arrayWithBuilder(object, builder);
break;
case 'number':
numberWithBuilder(object, builder);
break;
case 'string':
stringWithBuilder(object, builder);
break;
case 'date':
dateWithBuilder(object, builder);
break;
case 'boolean':
booleanWithBuilder(object, builder);
break;
default:
builder.append('null');
break;
}
}
withBuilder(object, stringBuilder);
return stringBuilder.toString();
}
JavaScriptSerializer.deserialize = function (data, secure) {
if (data == null || typeof data !== "string" || data.length === 0) {
return null;
}
var exp = data.replace(JavaScriptSerializer._dateRegEx, "$1new Date($2)");
try {
if (secure && JavaScriptSerializer._jsonRegEx.test(exp.replace(JavaScriptSerializer._jsonStringRegEx, ''))) {
throw null;
}
} catch (e) {
throw 'Cannot deserialize. The data does not correspond to valid JSON.';
}
return eval('(' + exp + ')');
}