关于php密码安全

密码学跟 PHP 没多大关系,但是为了保证php网站安全,可以做的是:
1. 别再用“自己想出来的加密”;

没密码学基础的人想出来的“超级安全的加密方法”,在搞密码学和数学的人眼里可能会存在安全漏洞(实际上的加密强度没你想象的那么高)。最起码,破译也不是人肉计算…… 更不是“凭智商硬凑”…… 如果加密算法本身不安全,那么不管组合多少次,都不会提高真正的安全性…… 就算不理解密码学,那么至少也别小看搞密码学和数学的那些人……说句不好听的 密码学到处都是装逼遭雷劈的例子 还是敬畏一下数学 用成熟的算法吧考虑到base64出来的东西没有雪崩效应,跟原文的字母概率分布应该可以直接映射出来,即使加上替换也就凯撒密码的复杂度吧.如果只为了客户端和服务器端通讯过程中完全保密,不被人看到,用https就行了,不过他提到了关闭连接这个说法,可能是想维持一个加密的长连接,那其实用TLS加密的websocket就行了都是现成的东西,自己base64后凯撒了一下,如果是为了存密码,这和裸奔一样.如果为了长连接中的内容保密,你可以直接试试websocket的TLS加密版,就看不到了。别鼓捣凯撒了,而且你的凯撒秘钥还是和原文放一起的。
不过如果乃的目的是 避免被审查程序扫描到 而不是 保密 的话就无所谓了。
2. 传输安全可以让站点使用 HTTPS;很多网站都是 https加密。某小黑知道你访问了什麽网站,但你是哪个用户,你在浏览什麽内容,它不可能知道。除非你洩漏个人账号信息。
3. 对存储内容加密可以用 php mcrypt 提供的 aes 加密;点击进入:安装mcrypt扩展的方法

这裡是一个使用 MCrypt 加密和解密一个文件的范例,程式会把档案 textfile.txt 加密成为 encrypted.txt,然后把这个档案解密成为 newfile.txt。

// Listing file_encrypt.php

<?php
$file = 'textfile.txt';
$initial_contents = file_get_contents($file);

if($initial_contents) {

// 这个函式开启 MCrypt 模组,并设定所使用的运作模式
$td = mcrypt_module_open('tripledes', '', 'ecb', '');

// 从一个随机来源建立一个初始向量
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

// 这个函式初始化所有加密所需的缓衝器
mcrypt_generic_init($td, $initial_contents, $iv);

// 这个函式加密数据
$encrypted_data = mcrypt_generic($td, $initial_contents);

$encrypted_file = @fopen('encrypted.txt','w');
$ok_encrypt = @fwrite($encrypted_file,$encrypted_data);
if($ok_encrypt) {
echo '成功建立密文档案 encrypted_file.txt!!!';
}
else {
echo ("档案写入失败!");
}

@fclose($encrypted_file);

mcrypt_generic_init($td, $initial_contents, $iv);

// 这个函式解密数据
$p_t = mdecrypt_generic($td, $encrypted_data);

$newfile = @fopen('newfile.txt','w');
$ok_decrypt = @fwrite($newfile,$p_t);
if($ok_decrypt) {
echo '成功建立解密文件 newfile.txt!!!';
}
else{
echo ("档案写入失败!");
}
@fclose($newfile);

// 这个函式为加密模组解除初始化
mcrypt_generic_deinit($td);

// 关闭加密模组
mcrypt_module_close($td);
}

?>

4. 存储密码可以加盐再 sha256。下面是文字以不同的编码方式再以 SHA256 加密的案例

// 使用 UTF-8 编码
string resultSha256 = System.Web.Helpers.Crypto.SHA256(formQueryString);

// 使用作业系统目前ANSI字码页的编码 (繁中是Big5)
SHA256 sha256 = new SHA256CryptoServiceProvider();
byte[] sha256Arr = sha256.ComputeHash(Encoding.Default.GetBytes(formQueryString));
string string256 = GetSha256Code(sha256Arr);

// 使用 UTF-8 编码
SHA256 sha256UTF8 = new SHA256CryptoServiceProvider();
byte[] sha256UTF8Arr = sha256.ComputeHash(Encoding.UTF8.GetBytes(formQueryString));
string stringUTF8256 = GetSha256Code(sha256UTF8Arr);

// 使用 Big5 编码 ※ VS 文字预设是 unicode,所以要先把 unicode 转成 Big5,950是指 Big5
SHA256 sha256Big5 = new SHA256CryptoServiceProvider();
byte[] sha256Big5Arr = sha256.ComputeHash(Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding(950), Encoding.Unicode.GetBytes(formQueryString)));
string stringBig5256 = GetSha256Code(sha256Big5Arr);

private string GetSha256Code(byte[] btyeArr)
{
string sha256Code = string.Empty;
foreach (byte bt in btyeArr)
{
sha256Code += bt.ToString("x2");
}
return sha256Code.ToUpper();
}

参与评论