rsaphp服务器搭建
附上出处链接:http://bbs.csdn.net/topics/370014844
四,用PHP生成密钥
PEAR::Crypt_RSA的Crypt_RSA_KeyPair类可以生成密钥。调用步骤如下:
require_once('Crypt/RSA.php');
$math_obj = &Crypt_RSA_MathLoader::loadWrapper();
$key_pair = new Crypt_RSA_KeyPair($key_lenth);
if (!$key_pair->isError()){
$public_key = $key_pair->getPublicKey();
$private_key = $key_pair->getPrivateKey();
$e =$math_obj->hexstr($math_obj->bin2int($public_key->getExponent()));
$d =$math_obj->hexstr($math_obj->bin2int($private_key->getExponent()));
$n =$math_obj->hexstr($math_obj->bin2int($public_key->getMolus()));
}
hexstr()是自己添加的函数,用来把十进制字符串转换为十六进制。对Crypt_RSA_Math_GMP很简单,只需:
function hexstr($num){
return gmp_strval($num,16);
}
对Crypt_RSA_Math_BCMath略麻烦些:
function hexstr($num){
$result = '';
do{
$result = sprintf('%02x',intval(bcmod($num,256))).$result;
$num = bcdiv($num, 256);
}while(bccomp($num, 0));
return ltrim($result,'0');
}
五,用php生成密钥(二)
为了提高加密速度,一般选一个较小的e。比较常用的是3、17、257、65537几个素数。
generate()生成密钥的算法是依次计算p,q,n,e,d。因此做了如下改动,以便可以自己选e值:
原来的:
function Crypt_RSA_KeyPair($key_len, $wrapper_name = 'default', $error_handler = '')
改后增加一个参数e:
function Crypt_RSA_KeyPair($key_len, $e = null, $wrapper_name = 'default', $error_handler = '')
这个函数调用generate()。效应地:
function generate($key_len = null)
也增加一个参数e:
function generate($key_len = null, $e = null)
把CRYPT_RSA-1.0.0的KeyPair.php中属于generate()的245~271行改动顺序,由e确定p和q:
if($e != null&&$this->_math_obj->cmpAbs($e,2)>0)
$e = $this->_math_obj->nextPrime($this->_math_obj->dec($e));//取个素数
else
{
while(true)
{
$e = $this->_math_obj->getRand($q_len, $this->_random_generator);
if ($this->_math_obj->cmpAbs($e,2)<=0)
continue;
$e = $this->_math_obj->nextPrime($this->_math_obj->dec($e));
break;
}
}
do{
$p = $this->_math_obj->getRand($p_len, $this->_random_generator, true);
$p = $this->_math_obj->nextPrime($p);
do{
do{
$q = $this->_math_obj->getRand($q_len, $this->_random_generator, true);
$tmp_len = $this->_math_obj->bitLen($this->_math_obj->mul($p, $q));
if ($tmp_len < $key_len)
$q_len++;
elseif ($tmp_len > $key_len)
$q_len--;
} while ($tmp_len != $key_len);
$q = $this->_math_obj->nextPrime($q);
$tmp = $this->_math_obj->mul($p, $q);
} while ($this->_math_obj->bitLen($tmp) != $key_len);
// $n - is shared molus
$n = $this->_math_obj->mul($p, $q);
// generate public ($e) and private ($d) keys
$pq = $this->_math_obj->mul($this->_math_obj->dec($p), $this->_math_obj->dec($q));
if($this->_math_obj->isZero($this->_math_obj->dec($this->_math_obj->gcd($e, $pq))))
break;
}while(true);
(网易的服务真体贴啊,连pre标记里面的东西都给改。还改不好)这样,如果要生成e为3的1024位密钥,可以如下调用:
$key_pair = new Crypt_RSA_KeyPair(1024,3);
六,干什么用
加密比较重要的数据。比如注册时用户输入的密码。
登录时把密码hmac一下就可以防止重放攻击(replay attack)了。对注册不存在这种攻击,但有密码泄露的危险。上传密码hash那点安全性根本不算什么。这个可以用RSA加密解决。
不过,对中间人攻击还是没办法。
另外一个
http://www.mingup.cn/php/2011/0121/101568.html
Ⅱ 怎么在PHP实现MD5withRSA-CSDN论坛
RSA 算法
1978年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法。
它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi
Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。
RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100
个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个
大素数的积。
密钥对的产生。选择两个大素数,p 和q 。计算:
n = p * q
然后随机选择加密密钥e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互质。最后,利用
Euclid 算法计算解密密钥d, 满足
e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )
其中n和d也要互质。数e和
n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。
加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,..., mi ,块长s
,其中 2^s <= n, s 尽可能的大。对应的密文是:
ci = mi^e ( mod n ) ( a )
解密时作如下计算:
mi = ci^d ( mod n ) ( b )
RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )
式验证。具体操作时考虑到安全性和 m信息量较大等因素,一般是先作 HASH 运算。
RSA 的安全性。
RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因
为没有证明破解
RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成
为大数分解算法。目前, RSA
的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现
在,人们已能分解140多个十进制位的大素数。因此,模数n
必须选大一些,因具体适用情况而定。
RSA的速度。
由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬
件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。
RSA的选择密文攻击。
RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装(
Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上
,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:
( XM )^d = X^d *M^d mod n
前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使
用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议
,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息
签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-Way Hash
Function
对文档作HASH处理,或同时使用不同的签名算法。在中提到了几种不同类型的攻击方
法。
RSA的公共模数攻击。
若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最普遍的
情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就
可得到恢复。设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则:
C1 = P^e1 mod n
C2 = P^e2 mod n
密码分析者知道n、e1、e2、C1和C2,就能得到P。
因为e1和e2互质,故用Euclidean算法能找到r和s,满足:
r * e1 + s * e2 = 1
假设r为负数,需再用Euclidean算法计算C1^(-1),则
( C1^(-1) )^(-r) * C2^s = P mod n
另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d
,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无
需分解模数。解决办法只有一个,那就是不要共享模数n。
RSA的小指数攻击。 有一种提高
RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。
但这样作是不安全的,对付办法就是e和d都取较大的值。
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研
究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为
人们接受,普遍认为是目前最优秀的公钥方案之一。RSA
的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难
度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数
人士倾向于因子分解不是NPC问题。
RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次
一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits
以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大
数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(
Secure Electronic Transaction
)协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。
更多问题到问题求助专区http://bbs.hounwang.com/
Ⅲ php 怎么生成rsa加密的公钥和私钥
function rsa_encode($pwd) {
$publicstr = file_get_contents('/path/to/public.key');
$publickey = openssl_pkey_get_public($publicstr); // 读取公钥
$r = openssl_public_encrypt($pwd, $encrypted, $publickey);
if ($r) {
return $encrypted
}
return false;
}
Ⅳ 可可网络验证v8客户端怎么搭建
《一键获取可可V8 PHP》是一款可可网络验证系统,该系统需要认证的时候由客户端软件主动调用xmlhttp组件连接服务端进行数据交互,服务端与客户端数据交互的加解密算法采用RSA不对称算法(服务端使用私钥加解密,客户端使用公钥加解密)。
【软件特色】:
1、服务端采用快速安全的php脚本语言和MySQL数据库构建,且可以搭建两个服务端以保证在一个服务端宕机时软件自动连接另一服务端来认证;
2、管理端采用主流的网页模式,无需下载管理客户端,能上网就可以登录管理端操作(智能手机也可以登录管理端);
3、客户端也就是你的软件,不论你使用哪种编程语言开发软件,都可以将可可网络验证系统无缝集成到您的软件中去;
4、可可网络验证做为商业软件的用户认证系统可更好的保护您的软件,其方便快捷的管理模式,会让你觉得管理软件的各种数据是件非常愉快的事。
Ⅳ 如何在mac下远程搭建git服务器
首先要有 ssh远程登陆的工具,比如secureCRT等
方案一 基于SSH直接搭建
Git支持的协议主要是四种:
本地: 需要文件共享系统,权限不好控制
HTTP:速度慢
SSH:同时支持读写操作,不支持匿名的读取(Git默认协议)
GIT:最快
从搭建的难易程度和特点综合筛选,最合适的还是ssh,并且大部分服务器上基本都有ssh服务,所以省去了不少麻烦。一个最基本的思路是给每一个人一个ssh帐号,这样大家就可以通过用户名和口令来访问了,但是显然这不是一个好的选择,这个做法有些多余,并且对于repo的权限很难管理。
在使用Github的时候,会利用rsa.pub公钥/私钥的方式,这样在服务端拥有用户的公钥(*.pub)之后就可以,跨过繁琐的口令,直接认证提交了,而服务端也会根据不同的用户身份,对其权限有着更加灵活的管理。因此我们也采用这种方式。
服务端
为了使远程库访问更加直观,先在服务器上创建一个名为git的账户,这样以后clone的时候就如下面的格式了:
git clone git@server:some.git
创建新的用户,创建repo等目录
$sudo adser git
$su git
$cd ~
$mkdir repos
在HOME下的.ssh目录,如果没有则创建,创建一个authorized_keys文件,这个文件就是用来管理所有git用户的公钥的,也就是这里面的用户对于项目有着R+W的权限。
客户端
对于每一个客户端,我们需要生成一对密钥和公钥,如果是Github用户,那么.ssh目录下,一定有id_rsa.pub和id_rsa两个文件,其中第一个是系统生成的公钥,另一个是自己要保存好的密钥。如果没有的话,可以在终端执行:ssh-keygen来生成,完成后,将自己的公钥提交给管理员,这就是一个注册的行为。
完成
最后一步,管理员将团队成员的公钥添加到authorized_keys中,比如将同学susie加入:
$ cat susie.pub >> authorized_keys
至此,大家可以通过git@server:repos/some.git来访问公共的版本库了。
问题
安全问题,成员可以登录git用户的shell,细节权限如分支等不好控制
管理麻烦,新建repo,或者增加成员比较麻烦,尤其是修改的时候
方案二 使用Gitolite服务
Gitolite 也是基于SSH协议构建的方便管理git repo的应用,可以通过其源码安装.
安装
安装按照官方给定的文档就可以轻易的实现:
$ git clone git://github.com/sitaramc/gitolite
$ mkdir -p $HOME/bin
$ gitolite/install -to $HOME/bin
$ gitolite setup -pk YourName.pub
如果执行最后一条命令的时候,gitolite不识别,则可以通过下面两种方式解决:
将gitolite添加到PATH里面
通过$HOME/bin/gitolite setup -pk YourName.pub 执行
至此,gitolite在服务端,搭建完毕,会发现此时HOME目录下增加了一个文件projects.list和一个目录repositories,后者就是我们的版本仓库了,每当新建repo的时候,就会在其中创建。
使用
是时候说一下gitolite的管理模式了,他会创建一个gitolite-admin的repo,管理员就是通过像这个repo提交配置文件而实现对git服务器的控制的。
首先,将这个repo导入到我们的workspace:在此之前,需要配置本地的ssh,gitolite要求管理员的本地密钥和其注册公钥的名字一致,比如我们安装的时候指定 -pk后面为 admin.pub 则管理员本地需要由admin对应的私钥。我们可以通过~/.ssh/config来进行配置(注:有些系统可以用conf,Mac OSX 下无效,只能用config).
host gitolite
user git
hostname yourhostname.com
port 22
identityfile ~/.ssh/admin
这样,当我们访问gitolite的时候就会自动根据配置文件执行,配置完成后可以根据下面的命令,将gitolite-admin转移到本地。
git clone gitolite:gitolite-admin.git
克隆完成后,可以发现,gitolite-admin下面有两个目录,其中conf保存配置文件,我们可以通过编辑里面的gitolite.conf文件,管理git服务器,keydir目录保存用户的公钥pub文件。
当我们讲修改后的repo 提交的时候,gitolite就会自动的应用这些配置,管理过程就方便了很多。
配置规则
打开gitolite.conf文件可以看到其中的示例:
To add new users alice, bob, and carol, obtain their public keys and add them to 'keydir' as alice.pub, bob.pub, and carol.pub respectively.
To add a new repo 'foo' and give different levels of access to these users, edit the file 'conf/gitolite.conf' and add lines like this:
repo foo
RW+ = alice
RW = bob
R = carol
上面的配置文件就是新建了一个repo foo,并且添加了三位项目成员,每一个人的权限不同。提交push后,管理便生效了。
可视化
我们可能会需要一个web界面来管理这些项目,我目前知道的有三种方式:
git源码中自带的组件,cgi脚本实现,使用gitolite服务
gitlab开源框架,基于ROR,新版本不再使用gitolite服务
FB开源PHP框架 phabricator,功能高端上档次
Ⅵ RSA的PHP服务器端之间问题,怎么解决
1 ) 如果存在从phpseclib访问 mod &的方法,那么问题将在更少的时间内被解决。
2 ) 在java中替换本机密码类,它的中第三方像 Bouncy Castle 那样的public 密钥是一个参数。
3 ) 将服务器端语言更改为 JSP 然后,可以在两边使用相同的类。
Ⅶ php中RSA加密,明文超长,需要分段加密该怎么做
这方面的话我不是很了解,一般来说,加密分为两个部分,一个是非对称加密,一个是对称加密,使用对称加密加密正文信息,使用非对称加密加密对称加密的密钥,然后发送加密数据(消息摘要和数字签名就不讨论了),这是正规的数据加密策略,对称加密默认支持大数据分段加密策略,你只需要从接口中完成加密即可,而且对称加密速度比非对称加密快很多,如果你需要使用这个策略建议使用AES。
如果你不愿意使用对称加密,只愿意使用AES加密,那你就必须丧失速度了,而且自己处理分段加密,因为RSA加密通常是117个字节就要分段(这个长度可能和密钥长度有关,我是用的接口是117),你需要自己把数据变成N个117字节的数据段来完成加密,解密也需要自己完成字节拼装。详细还是建议你去后盾人平台去看看视频教学吧,那里面有的,讲的很清楚。
Ⅷ Squid+Stunnel怎么搭建代理服务器
一,服务器说明
一台国外的vps(推荐linode),服务端squid
一台公司内部的PC机,能访问外网就行,客户端stunnel
要达到的目的,公司内部人员,连接公司内部的pc机,通过stunnel通道连接远端squid,上外网查资料,谷歌,众里寻你千网络,蓦然回首你却在高墙外头。唉。
二,服务端安装squid
1,安装squid
# yum install squid openssl openssl-devel
2,生成加密代理证书
# cd /etc/squid
# openssl req -new > tank.csr //要求输入密码和确认密码
# openssl rsa -in privkey.pem -out tank.key //输入上面输入的密码
# openssl x509 -in tank.csr -out tank.crt -req -signkey tank.key -days 3650
3,配置squid
# vim /etc/squid/squid.conf
acl OverConnLimit maxconn 10 //限制每个IP最大允许10个连接,防止攻击
minimum_object_size 1 KB //允午最小文件请求体大小
maximum_object_size 1 MB //允午最大文件请求体大小
cache_swap_low 10 //最小允许使用swap 10%
cache_swap_high 25 //最大允许使用swap 25%
cache_mem 300 MB //可使用内存
/*****************上面是新增,下面是修改************************/
cache_dir ufs /var/spool/squid 2048 16 256 //2048存储空间大小,一级目录16个,二级256个
https_port 4430 cert=/etc/squid/tank.crt key=/etc/squid/tank.key //端口可自定义
http_access allow all
vps硬盘,内存都不富裕,所以对squid所占用的内存和硬盘等要加以控制。
4,启动squid,并查看
# /etc/init.d/squid start
# ps aux |grep squid
root 15984 0.0 0.0 103256 844 pts/0 S+ 17:31 0:00 grep squid
root 16585 0.0 0.0 72484 4176 ? Ss 15:27 0:00 squid -f /etc/squid/squid.conf
squid 16587 0.0 0.3 93064 29468 ? S 15:27 0:03 (squid) -f /etc/squid/squid.conf
squid 16589 0.0 0.0 48632 2100 ? S 15:27 0:00 (ncsa_auth) /etc/squid/passwd
squid 16590 0.0 0.0 48632 1788 ? S 15:27 0:00 (ncsa_auth) /etc/squid/passwd
squid 16591 0.0 0.0 48632 1784 ? S 15:27 0:00 (ncsa_auth) /etc/squid/passwd
squid 16592 0.0 0.0 48632 1788 ? S 15:27 0:00 (ncsa_auth) /etc/squid/passwd
squid 16593 0.0 0.0 48632 1784 ? S 15:27 0:00 (ncsa_auth) /etc/squid/passwd
squid 16594 0.0 0.0 20084 1112 ? S 15:27 0:00 (unlinkd)
VPS很少有,自启动开启防火墙的,如果有先关掉,等都配置好了,在开放端口。
三,客户端安装配置stunnel
1,安装
# yum install stunnel
2,新增配置/etc/stunnel/stunnel.conf,添加以下内空
client = yes
fips = no
[https]
accept = 7071
connect = 外网VPS的IP:4430
如
果报,FIPS_mode_set: 2D06C06E: error:2D06C06E:FIPS
routines:FIPS_mole_mode_set:fingerprint does not
match,stunnel.conf配置文件中加上,fips = no
3,启动stunnel并查看
# stunnel //启动,默认配置文件路径 /etc/stunnel/stunnel.conf
# ps aux |grep stunnel //查看
root 15972 0.0 0.0 103256 848 pts/0 S+ 17:30 0:00 grep stunnel
root 21099 0.0 0.0 41532 1060 pts/0 S 15:42 0:00 stunnel
root 21100 0.0 0.0 41532 1060 pts/0 S 15:42 0:00 stunnel
root 21101 0.0 0.0 41532 1060 pts/0 S 15:42 0:00 stunnel
root 21102 0.0 0.0 41532 1060 pts/0 S 15:42 0:00 stunnel
root 21103 0.0 0.0 41532 1060 pts/0 S 15:42 0:00 stunnel
root 21104 0.0 0.0 2077984 6824 ? Ss 15:42 0:00 stunnel
到这儿就安装好了,设置浏览器代理,填写局域网IP和端口,就可以访问外网了,这样不太安全,如果能加上用户认证会,安全一点。
四,用户认证
1,添加认证用户 test123
# htpasswd -c /etc/squid/passwd test123
2,配置代理以及用户认证
# vim /etc/squid/squid.conf //添加以下内容
auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/passwd //认证方式为basic,认证程序路径和密码文件路径
auth_param basic children 5 //认证程序的进程数
auth_param basic credentialsttl 1 hours //认证有效时间
auth_param basic realm my test prosy //浏览器显示输入用户/密码对话框时,显示的内容
acl test123 proxy_auth REQUIRED
http_access allow test123 //普通用户需要通过认证才能访问
http_access deny all //最下面,匹配是从上到下的
3,重启squid
# /etc/init.d/squid restart
这样squid代理就搭好了,浏览器里面设置一下代理IP和端口,会弹出认证框,输入用户名和密码就行了。
4,php也可以利用代理服务器
function testCurl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $gurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
curl_setopt($ch, CURLOPT_PROXY, "192.168.1.18:7071"); //ip/端口
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'test123:123456'); //认证用户和密码
$result=curl_exec($ch);
curl_close($ch);
return $result;
}
echo testCurl("google.com");
Ⅸ windows怎么运行php openssl rsa
1、首先得安装php的openssl扩展
php -m | grep openssl
执行以上命令,确保已经安装了openssl php扩展
2、接下来要安装Linux openssl
yum -y install openssl-devel
3、生成RSA公钥和私钥
3.1、生成私钥
openssl genrsa 1024 > rsa_private.key
#注意:1024是密钥的长度,如果密钥较长,相应加密后的密文也会较长
3.2、生成公钥
openssl rsa -in rsa_private.key -pubout > rsa_public.key