PHP GPG 加密实践

来源:互联网 发布:linux下创建用户 编辑:程序博客网 时间:2024/06/18 00:22

近期搞一些外部 对接. 对方是Java程序,使用的是GPG加密协议.


关于GPG的资料较多,但如果想在PHP中使用,就比较 复杂了.


先讲解一些基本概念,别的文章中都把这些基本概念忽略了,认为大家都知道,实际我们小白程序员通常是没接触过的.


1.GPG的别名是GnuPG,  是一个 非对称加密协议.  每一个密钥包括一个公钥,一个私钥.

2.通常 公钥是用来加密的,私钥是用来签名的.

3.A向B发送一个密文时有以下三种方式

    3.1 把明文通过B的公钥进行加密,发送给B.   以保证 除了B,没有别人能解开.

    3.2 把明文通过A的私钥进行签名,发送给B.  以保证 这密文一定是A发送的,别人无法伪造.

    3.3 把明文通过B的公钥进行加密,再通过A的私钥签名,以保证 这东西一定是A发送的,并且只有B能解开.

4.CentOS中 gpg是默认安装的, 如果别的Linux系统,请自行安装,

   Windows下,请安装gpg4win 软件.  其中的4 表示  for 

 5.PHP 需要安装 GPG扩展, 只有LINUX下才有此扩展.  Windows下没找到安装方法.

    我是搞了个CentOS虚拟机进行的开发 测试.

6. 每个密钥有以下四部分概念

    6.1  公钥 pub   代表public key

    6.2 私钥 sec  代表 secret key

    6.3 子公钥 sub

    6.4 子私钥 ssb

7.在Linux上,GPG密钥是绑定到ROOT用户和操作系统上的.

    所以,开发测试时,要使用ROOT用户登录

8. GPG 命令

     gpg -k    查看全部公钥

     gpg -K  查看全部私钥

     查询 结果 中包含当前已经绑定到操作系统中的 密钥

         有些只有公钥,有些只有私钥,有些同时有公钥和私钥.

9.指定一个密钥时, 可以用 KEY (即1024b/后面的那些 十六进制),也可以用标识(即 邮箱前面的那个英文单词,创建时指定的)

10.密钥在传递时,是以文件形式进行的, 有两种格式: 二进制,ASCII码

 11.导入, 可以把密钥绑定到操作系统 上,

     导出,可以从操作系统 上把密钥变成文件 ,可指定格式(二进制,ASCII)

 12.还有个密码的概念,请注意. 

      密码是用来保护私钥的. (再一次保护). 

     即,使用私钥签名时,需要ROOT用户在界面中输入密码.  并且,无法使用 输入转向来自动指定密码.

13.以上解释了各种概念. 其它的百度都有.


下面来说,如何用PHP来GPG 加密 和签名

要点1. 公钥和私钥,请导出成文件,两种格式都可.  PHP可以自动识别,都认识.

要点2. 不要对私钥使用密码进行保护. 因为密码必须人工输入. 保护好你的密钥文件吧. 服务器别被人入侵.

要点3. 由于GPG函数的运行只能在ROOT用户下进行, 而PHP的WEB服务器(Nginx/Apache)并不是ROOT用户.

    我们也不想给Web用户提升权限.

    那么怎么办?



    LINUX系统的定时任务Crontab启动的任务可以使用ROOT权限

    那么 我们搞个定时任务要执行的PHP程序即可

    命令行下 使用 PHP  ****.php  测试,如果执行成功,  那么 把这个放到定时任务里即可.

    定时策略自行规划.


   如果使用GPG过程中遇到问题,联系我吧  Q:31008088


0 0