精华内容
下载资源
问答
  • 数据加密

    千次阅读 2019-12-13 19:45:20
    数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。       数据加密仍是计算机...

    最近女友突然问我什么是加密:

    我当然毫无求生欲的先偷懒贴一波百度的加密

          数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。
          数据加密仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息的安全的作用。

    然后我就被打了,原因:你敷衍我。。。。

    简单来说就是通过加密算法将明文(谁拿到内容,都能看懂的),变为密文(别人都看不懂,只有某些人才能看懂的内容)。

    加密的方法根据密钥的不同分为两种体系。

    对称加密非对称加密

    对称加密:就是加密和解密用同一种密钥。比如我们都了解的阿特巴希加密法,26个英文字母正序和倒叙排列就是对应的关系。

    明文是A 对应的 密文就是Z
    明文是B 对应的 密文就是Y

    在阿特巴希密码中“nlmvb”代表“MONEY”。

    制作密文是用阿特巴希加密法制作,读取也就是解密是也用阿特巴希加密法解密。

    比如我想对女友说I Love You 。我要先用加密码改造成密文,也就是R OLEV BLF 而而她想看懂也要用相同的加密发。

    这就是对称加密。

    优点:效率高,加密速度快,可以加密大量的数据,几G到几十G;

    缺点:密钥的传递问题,特别是多个人同时通信。
    我用的密钥怎么远程传递给女友呢?
    多人同时通信的问题,如果我在群聊里说了一句密文,只想让女友知道,但是所有知道我加密法的人都能知道我的意思。也就造成的安全隐患。

    非对称加密

    加密和解密使用不同的密钥。

    通过公钥和私钥实现的,就是我发布了两个规则,一个规则用来加密叫做公钥,一个规则用来解密叫做私钥。比如一段信息:6666 用公钥加密后是rueidgfsnj,然后用私钥解密后是6666。

    公钥就随便传播,反正私钥在我手上只有我能读。

    进一步解释就是收文件的一方发送公钥给别人。

    优点:解决了密钥传递的问题

    缺点:效率低,加密速度慢,比对称加密速度慢1000倍,只能加密少量数据

    对称加密+非对称加密
    将一段信息先进行对称加密,因为速度快,能加密大文件。然后将对称加密的密钥进行非对称加密,最后传输的是2个文件,1、被加密的数据文件。2、被加密的密钥文件。

    解密时,先用私钥解密密钥文件,获得对称加密的密钥,然后用这个密钥解密数据文件。

    在这里插入图片描述

    加密算法:

    就是具体的数据加密过程了。

    GPG
          PGP是比较成熟的加密算法,由于PGP算法太安全(破解它需要3亿年),属于美国政府严禁传入中国的计算机产品。我们现在能够得以使用GnuPG(它是PGP的开源产品),是要感谢GNU和自由软件运动,这也是我们推崇开源运动的原因!!GPG是一个完全免费、源代码公开,并且与PGP完全兼容的软件产品。今天,GPG已经拥有众多的企业和个人用户。作为一个开源并且免费的加密和数字签名软件已经存在多年。它不但可以为企业、个人之间的重要信息提供加密保护,还可以为出版的软件、内核等电子产品进行数字签名,防止产品被篡改,最大程度地保障信息安全。

    SSL
          SSL:Secure Sockets
          Layer 安全套接层,为Netscape(美国网景公司)所研发;
          TLS:Transport Layer Security(传输层安全)是SSL的继任者,为网络通信提供安全及数据完整性的一种安全协议。
    SSL的功能:
          TLS与SSL在传输层对网络连接进行加密,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。
          已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。
          目前一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。
          SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。

    HTTPS

    具体操作:

    secret:172.16.12.95
    secret2:172.16.12.96

    [root@secret ~]# useradd username1
    [root@secret ~]# echo 000000 | grep username1 --stdin
    
    [root@secret2 ~]# useradd username2
    [root@secret2 ~]# echo 000000 | passwd username2 --stdin
    

    用这两个用户登录。

    【1】GPG

    1、对称加密:

    [username1@secret ~]$ echo "hi username2" > file.txt
    [username1@secret ~]$ gpg -c file.txt
    

    然后弹出这个。

    在这里插入图片描述
    输入密码:英文字母,数字,字符,8位以上。

    我的是:abc123_# 只要记住就好了。

    [username1@secret ~]$ ls
    file.txt  file.txt.gpg
    

    然后就很能看到加密后的文件了。

    确实无法看懂…

    在这里插入图片描述

    [username1@secret ~]$ scp file.txt.gpg username2@172.16.12.96:/home/username2
    把密文发过去。
    

    secret2解密。

     gpg -d file.txt.gpg 
    
    gpg: directory `/home/username2/.gnupg' created
    gpg: new configuration file `/home/username2/.gnupg/gpg.conf' created
    gpg: WARNING: options in `/home/username2/.gnupg/gpg.conf' are not yet active during this run
    gpg: keyring `/home/username2/.gnupg/secring.gpg' created
    gpg: keyring `/home/username2/.gnupg/pubring.gpg' created
    gpg: CAST5 encrypted data
    gpg: encrypted with 1 passphrase
    hi username2   >>>>>>>这个就是解密后的内容
    gpg: WARNING: message was not integrity protected
    

    需要输入在1上设置的密码。abc123_#。就可以解码了。

    [username2@secret2 ~]$ gpg -d file.txt.gpg  > file1
    直接存到硬盘上。
    

    2、非对称加密

    这个最好直接连虚拟而不是远程,因为会根据鼠标键盘的移动轨迹记录随机数。远程工具没有鼠标,很慢。

    [username1@secret ~]$ gpg --gen-key
    
    Please select what kind of key you want:
       (1) RSA and RSA (default)
       (2) DSA and Elgamal
       (3) DSA (sign only)
       (4) RSA (sign only)
    Your selection? 1	##加密算法
    
    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (2048)	##密钥长度
    Requested keysize is 2048 bits
    
    Please specify how long the key should be valid.
             0 = key does not expire
          <n>  = key expires in n days
          <n>w = key expires in n weeks
          <n>m = key expires in n months
          <n>y = key expires in n years
    Key is valid for? (0) 0	##密钥的有效期
    Key does not expire at all
    
    Is this correct? (y/N) y
    
    GnuPG needs to construct a user ID to identify your key.
    
    Real name: user2-node2		##唯一标识
    Email address: xxx@126.com	##邮箱
    Comment: user2's key		##描述,可以不写
    
    Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O	##确认
    
    

    在这里插入图片描述
    看上边的,动鼠标和键盘记录随机数。

    在这里插入图片描述
    完成状态。

    在这里插入图片描述
    这几个就是生成的文件了。

    在家目录的.gnupg/下。

    查看公钥,私钥:

    [username1@secret ~]$ gpg --list-key    //公钥
    /home/username1/.gnupg/pubring.gpg
    ----------------------------------
    pub   2048R/2318820A 2019-12-13
    uid                  username-12.95 (username1's key) <username1@163.com>
    sub   2048R/72FC8115 2019-12-13
    
    
    [username1@secret ~]$ gpg --list-secret-key   //私钥
    /home/username1/.gnupg/secring.gpg
    ----------------------------------
    sec   2048R/2318820A 2019-12-13
    uid                  username-12.95 (username1's key) <username1@163.com>
    ssb   2048R/72FC8115 2019-12-13
    

    username1给username2发送文件:

    user2导出公钥:

    [username2@secret2 ~]$ gpg --export username2-12.96		//乱数形式  后边的是公钥的real-name,上边说的唯一标识。
    [username2@secret2 ~]$ gpg --export --armor username2-12.96		//二进制形式
    

    在这里插入图片描述
    乱数形式的

    [username2@secret2 ~]$ gpg --export --armor username2-12.96
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    Version: GnuPG v2.0.22 (GNU/Linux)
    
    mQENBF3z3d4BCADKfMNGyidxEChZEuFXErnARnoDeZJluGXkyC/mXSBVzNGnS7mI
    e4xQUclVNEdPUYYFDRgW2vE6ggReA1O7giwZX+Fw1ePFYaLtG0mD/zUTzWUP+K5S
    /69gX9R87lrLQCB4EilSwF0quLgY9K0MeNkF1655KtEsFxs68jjAGu4VvVRP3xmN
    40wNKCXXVwGoW/gUDcVoQPcrCgmfAAkiS46lv5J0X0a8WzB9G+FagPNJvjUGDynC
    

    二进制形式的。

    [username2@secret2 ~]$ gpg --export --armor username2-12.96 > username2.pub
    制作公钥文件
    

    用scp发给username1

    username1导入2 的公钥

    [username1@secret ~]$ gpg --import username2.pub 
    
    查看公钥发现有2个
    [username1@secret ~]$ gpg  --list-key
    /home/username1/.gnupg/pubring.gpg
    ----------------------------------
    pub   2048R/2318820A 2019-12-13
    uid                  username-12.95 (username1's key) <username1@163.com>
    sub   2048R/72FC8115 2019-12-13
    
    pub   2048R/2BB8ED53 2019-12-13
    uid                  username2-12.96 (username2's key) <username2@163.com>
    sub   2048R/1E4DA576 2019-12-13
    

    username1用2 的公钥加密。

    [username1@secret ~]$ cp /etc/passwd ./userlist.txt
    做一个数据文件。
    [username1@secret ~]$ gpg --encrypt --recipient username2-12.96  --armor userlist.txt
    加密
    

    此时u2发过来的那个公钥文件基本没啥用了,因为已经导入了公钥。

    [username1@secret ~]$ ls
    file.txt  file.txt.gpg  userlist.txt  userlist.txt.asc  username2.pub
    

    已经能看到userlist.txt.asc这个加密后的文件。

    再把这个加密后的文件发给u2

    user2解密:

    [user2@secret2 ~]$ gpg --decrypt --armor userlist.txt.asc
    	输入自己的私钥密码
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    就能看到文件内容了
    

    导入的公钥是不被信任的,需要对公钥进行签名操作:
    u1

    [user1@secret ~]$ gpg --fingerprint username2-12.96
    	查看u2的公钥的指纹信息
    [user1@secret ~]$ gpg --sign-key username2-12.96
    	对u2的公钥进行签名操作
    	输入自己的私钥密码
    Really sign? (y/N) y
    

    现在在用公钥进行加密就不回提示是危险的公钥。

    【2】openssl

    [username1@secret ~]$ openssl
    OpenSSL> ?
    openssl:Error: '?' is an invalid command.
    
    Standard commands
    asn1parse         ca                ciphers           cms               
    crl               crl2pkcs7         dgst              dh   
    
    Standard commands	
    	//命令
    
    Message Digest commands (see the `dgst' command for more details
    	//用于签名的加密算法
    	
    Cipher commands (see the `enc' command for more details)
    	//用于加密的加密算法
    

    1、对称加密:
    user1

    [username1@secret ~]$ openssl enc -e -bf -in userlist.txt -out userlist.txt.ssl
    enter bf-cbc encryption password:  //设置对称加密的密码
    Verifying - enter bf-cbc encryption password:
    	enc	加密操作
    	-e	加密
    	-bf	加密算法
    	-in		准备加密的文件
    	-out	加密后生成的文件
    [username1@secret ~]$ scp userlist.txt.ssl username2@172.16.12.96:/home/username2
    发给u2
    

    user2

    [username2@secret2 ~]$ openssl enc -d -bf -in userlist.txt.ssl -out userlist.txt
    enter bf-cbc decryption password://输入user1 那边设置的密码
    
    然后生成文件userlist.txt
    
    [username2@secret2 ~]$ cat userlist.txt
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ok
    

    2、非对称加密
    生成公钥和私钥:
    私钥可以设置密码,也可以不设置密码。

    [user2@node2 ~]$ openssl genrsa 1024 > user2.pri
    	创建私钥,无密码
     user2.pri私钥文件
     
    
    [user2@node2 ~]$ openssl genrsa -des3 1024 > user2.pas
    Generating RSA private key, 1024 bit long modulus
    ......................................................++++++
    .........++++++
    e is 65537 (0x10001)
    Enter pass phrase:
    Verifying - Enter pass phrase:
    	创建私钥,有密码
    

    从私钥中提取公钥

    [username2@secret2 ~]$ openssl rsa -in user2.pri -pubout -out user2.pub
    writing RSA key
    
    user2.pub这个是公钥文件
    
    [user2@node2 ~]$ openssl rsa -in user2.pas -pubout -out user2.pub1
    Enter pass phrase for user2.pas:输入私钥密码
    writing RSA key
    
    带密码私钥提取公钥
    
    [username2@secret2 ~]$ scp user2.pub username1@172.16.12.95:/home/username1
    
    公钥发给u1
    
    [username1@secret ~]$ openssl rsautl -in userlist.txt -out userlist-txt.sec -pubin -inkey user2.pub -encrypt
    RSA operation error
    139963374098336:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:153:
    可以看到报错,因为文件太大了。
    
    [username1@secret ~]$ ls -lh userlist.txt
    -rw-r--r-- 1 username1 username1 1.8K Dec 14 03:01 userlist.txt
    这都算大。。。。。。
    

    user1重新加密

    [username1@secret ~]$ echo "123456" > key
    [username1@secret ~]$ openssl rsautl -in key -out key.sec -pubin -inkey user2.pub -encrypt
    
    [username1@secret ~]$ scp key.sec username2@172.16.12.96:/home/username2
    发给user2
    

    user2 解密

    [username1@secret ~]$ openssl rsautl -in key.sec -out key -inkey user2.pri -decrypt
    
    [username1@secret ~]$ cat key
    123456
    

    3、对称加密+非对称加密
    user1给user2发送大文件,并加密。
    首先、用对称加密加密大的数据文件。
    其次、用非对称加密法加密对称加密的加密算法和密码,生成密钥密码文件。
    最后、user2 用私钥解密密钥密码文件,获得对称加密的算法和密码,用得到的算法和密码解密数据文件。

    user1:

    [username1@secret ~]$ openssl enc -e -bf -in userlist.txt -out userlist.txt.ssl
    对称加密大文件。并设置密码。
    
    [username1@secret ~]$ echo "-bf,123" > key
    制作密钥文件,里边写了对称加密的算法和密码。
    
    [username1@secret ~]$ openssl rsautl -in key -out key.sec -pubin -inkey user2.pub -encrypt
    非对称加密加密这个密钥文件。、
    
    [username1@secret ~]$ scp key.sec username2@172.16.12.96:/home/username2
    [username1@secret ~]$ scp userlist.txt.ssl username2@172.16.12.96:/home/username2
    两个文件都发给user2
    

    user2解密

    [username2@secret2 ~]$ openssl rsautl -in key.sec -out key -inkey user2.pri -decrypt
    解密密钥文件
    [username2@secret2 ~]$ cat key
    -bf,123
    获得对称加密的算法和密码
    [username2@secret2 ~]$ openssl enc -d -bf -in userlist.txt.ssl -out userlist.txt
    enter bf-cbc decryption password:
    输入密码 用bf算法
    
    [username2@secret2 ~]$ 
    [username2@secret2 ~]$ ls
    key.sec    user2.pub     userlist.txt.asc  username2.pub
    key           user2.pri  userlist.txt--->这个就是解密后的大文件, 
    

    到此,加密就基本说完了。我女友是懂了,非常开心的打了我,说又知道了对她来说没啥用的东西。

    我直接吓醒了,然后长出了一口气,幸好我没有女朋友。

    展开全文
  • PostgreSQL 数据加密之 pgcrypto

    千次阅读 热门讨论 2020-10-16 16:22:50
    PostgreSQL 扩展模块 pgcrypto 提供了单向加密算法 MD5、SHA、HMAC ,PGP 双向加密算法 Blowfish、AES、DES 等,可以用于实现数据加密和解密。本文介绍了这个模块的安装、函数的使用以及实际案例,包括用户密码...

    数据包含

    大家好,我是只谈技术不剪发的 Tony 老师。

    根据信息安全的相关要求,用户的敏感信息通常需要在数据库中进行加密存储,例如登录密码、信用卡号、身份证号等。PostgreSQL 提供了一个扩展的模块:pgcrypto ;今天我们就来介绍一下这个模块的使用方法和案例。

    如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

    pgcrypto 简介

    pgcrypto 扩展模块可以用于 PostgreSQL 中实现加密和解密功能。从 PostgreSQL 13 版本开始 pgcrypto 属于“可信”模块;只要用户拥有当前数据库上的 CREATE 权限就可以安装该模块,不再需要超级用户权限。

    pgcrypto 提供了两类加密算法:单向加密和双向加密。

    单向加密属于不可逆加密,无法根据密文解密出明文,适用于数据的验证,例如登录密码验证。常用的单向加密算法有 MD5、SHA、HMAC 等。双向加密属于可逆加密,根据密文和密钥可解密出明文,适用于数据的安全传输,例如电子支付、数字签名等。常用的双向加密算法有 AES、DES、RSA、ECC 等。

    pgcrypto 安装

    首先,我们需要安装 pgcrypto 模块。对于 Linux 操作系统,可以通过 postgresql-contrib 软件包下载 PostgreSQL 扩展模块;对于 Windows 和 macOS,默认安装已经包含了扩展模块。我们只需要执行以下语句在当前数据库中安装 pgcrypto 模块:

    CREATE EXTENSION pgcrypto;
    

    单向加密

    通用哈希函数

    digest()函数可以根据不同的算法生成数据的二进制哈希值,语法如下:

    digest(data text, type text) returns bytea
    digest(data bytea, type text) returns bytea
    

    其中,data 是原始数据;type 是加密算法,包括 md5、sha1、sha224、sha256、sha384 以及 sha512;函数的返回结果为二进制字符串。

    假如存在以下用户表:

    CREATE TABLE users (
      id SERIAL PRIMARY KEY,
      username varchar(20) NOT NULL UNIQUE,
      password text NOT NULL
    );
    

    创建新用户时,可以使用 digest() 函数对密码进行加密存储:

    INSERT INTO users(username, password) 
    VALUES ('tony', encode(digest('123456','md5'), 'hex'));
    
    INSERT INTO users(username, password) 
    VALUES ('anne', encode(digest('123456','md5'), 'hex'));
    
    SELECT * FROM users;
    id|username|password                        |
    --|--------|--------------------------------|
     1|tony    |e10adc3949ba59abbe56e057f20f883e|
     2|anne    |e10adc3949ba59abbe56e057f20f883e|
    

    其中,encode 函数用于将二进制字符串转换为十六进制的文本。

    当用户登录时,使用同样的方法加密输入的密码参数:

    -- 输入正确密码时
    SELECT id
    FROM users
    WHERE username = 'tony'
    AND password = encode(digest('123456','md5'), 'hex');
    id|
    --|
     1|
    
    -- 输入错误密码时
    SELECT id
    FROM users
    WHERE username = 'tony'
    AND password = encode(digest('abc123','md5'), 'hex');
    

    📝PostgreSQL 还提供了内置的 md5()、sha224()、sha256()、sha384() 以及 sha512() 函数。

    这类加密算法的主要问题是相同的数据经过加密之后的结果相同。因此。在实际应用中可以将用户名和密码字符串连接之后再进行加密。另一种方法就是使用hmac()函数:

    hmac(data text, key text, type text) returns bytea
    hmac(data bytea, key bytea, type text) returns bytea
    

    其中,data 是原始数据;key 是加密密钥;type 是加密算法,包括 md5、sha1、sha224、sha256、sha384 以及 sha512;函数的返回结果为二进制字符串。

    以下语句使用 hmac() 函数重新设置了用户的密码:

    UPDATE users
       SET password = encode(hmac('123456', username, 'md5'), 'hex');
    
    SELECT * FROM users;
    id|username|password                        |
    --|--------|--------------------------------|
     1|tony    |7a86cd4a12d7a54d65a4fe5854aaf41f|
     2|anne    |9079d683b5fc5033427c2af2b6de4d01|
    

    使用 username 作为密钥,相同的密码加密之后的结果不同。

    对于 digest() 函数,如果同时被修改了原始数据和加密结果,无法进行识别;hmac() 函数只要密钥没有泄露的话,可以发现被篡改的数据。

    密码哈希函数

    crypt() 和 gen_salt() 函数专用于密码加密,其中 crypt() 用于加密数据,gen_salt() 用于生成 salt(加盐)。

    crypt() 中的算法和普通的 MD5 或者 SHA1 哈希算法存在以下不同之处:

    1. crypt() 中的算法它们更慢。由于密码包含的数据量很小,这是增加暴力破解难度的唯一方法。
    2. 它们使用了一个随机值(称为盐值),因此密码的用户加密后的密码不同。这也可以针对破解算法提供一种额外的安全保护。
    3. 它们的结果中包括了算法类型,因此可以针对不同用户使用不同的算法对密码进行加密。
    4. 其中一些算法具有自适应性,意味着当计算机性能变得更快时,可以调整算法使其变得更慢,而不会产生与已有密码的不兼容性。

    下表列出了 crypt() 函数支持的算法:

    算法密码最大长度自适应性盐值比特位数输出结果长度描述
    bf72✔️12860基于 Blowfish 的 2a 变种算法
    md5无限4834基于 MD5 的加密算法
    xdes8✔️2420扩展 DES
    des81213原始 UNIX 加密算法

    crypt() 函数的语法如下:

    crypt(password text, salt text) returns text
    

    该函数返回 password 字符串 crypt(3) 格式的哈希值,salt 参数由 gen_salt() 函数生成。例如:

    UPDATE users
       SET password = crypt('123456', gen_salt('md5'));
    
    SELECT * FROM users;
    id|username|password                          |
    --|--------|----------------------------------|
     1|tony    |$1$ivLmU/yu$PS07Htg2x3KCiTVEu/rPz.|
     2|anne    |$1$NwIIA5wL$USvujGEN8otgSkRNf9BAN1|
    

    对于相同的密码,crypt() 函数每次也会返回不同的结果,因为 gen_salt() 函数每次都会生成不同的 salt。校验密码时可以将之前生成的哈希结果作为 salt:

    SELECT id
    FROM users
    WHERE username = 'tony'
    AND password = crypt('123456', password);
    id|
    --|
     1|
    

    gen_salt() 函数用于生成盐值 salt,语法如下:

    gen_salt(type text [, iter_count integer ]) returns text
    

    该函数每次都会生成一个随机的盐值字符串,该字符串同时决定了 crypt() 函数使用的算法;type 参数用于指定一个生成字符串的哈希算法,可能的取值包括 des、xdes、md5 以及 bf。

    SELECT gen_salt('des'), gen_salt('xdes'), gen_salt('md5'), gen_salt('bf');
    gen_salt|gen_salt |gen_salt   |gen_salt                     |
    --------|---------|-----------|-----------------------------|
    vT      |_J9..AtLK|$1$Ukh6Ogiu|$2a$06$GFfpofxOmtSWbnO3GXs5oe|
    

    每种算法生成的 salt 拥有固定的格式,例如 bf 算法结果中的 $2a$06$,2a 表示 Blowfish 的 2a 变种算法,06 表示迭代的次数。

    对于 xdes 和 bf 算法,iter_count 参数用于指定迭代的次数。迭代次数越多,计算的时间越长,破解所需的时间也越长。过高的迭代次数可能使得计算一个哈希值需要几年的时间,但是这并没有什么实际用途。如果忽略 iter_count,将会使用默认的迭代次数。

    算法默认次数最小次数最大次数
    xdes725116777215
    bf6431

    对于 xdes 算法,迭代次数必须是一个奇数。

    如果想要选择一个合适的迭代次数,可以参考原始 DES 加密算法设计时的性能是在当时的硬件上每秒执行 4 次加密。每秒少于 4 次加密可能会降低可用性,每秒多于 100 次加密又可能太快了。

    下表给出了不同哈希算法的相对性能比较。表中还列出了它们遍历所有由 8 字符组成的密码所需的时间,密码只包含小写字母、或者大小写字母及数字。 对于 crypt-bf 算法,斜杠后面的数字代表了 gen_salt() 函数中的 iter_count 参数。

    算法哈希次数/秒[a-z][A-Za-z0-9]相当于 MD5 消耗的时间倍数
    crypt-bf/817924 年3927 年100k
    crypt-bf/736482 年1929 年50k
    crypt-bf/671681 年982 年25k
    crypt-bf/513504188 天521 年12.5k
    crypt-md517158415 天41 年1k
    crypt-des23221568157.5 分钟108 天7
    sha13777427290 分钟68 天4
    md5 (hash)15008550422.5 分钟17 天1

    备注:

    • 以上测试使用的机器是 Intel Mobile Core i3。
    • crypt-des 和 crypt-md5 算法的结果来自 John the Ripper v1.6.38 -test 结果。
    • md5 哈希的结果来自 mdcrack 1.2。
    • sha1 的结果来自 lcrack-20031130-beta。
    • crypt-bf 的结果通过简单遍历 1000 次 8 字符组成的密码得到。这种方式可以比较不同迭代次数的性能。以下结果可以作为参考:john -test 显示 crypt-bf/5 每秒循环 13506 次(结果中的细微差异说明 pgcrypto 中的 crypt-bf 实现和 John the Ripper 相同)。

    📝实际情况下并不会使用“遍历所有组合”的破解方法,通常是利用一个包含常用词汇及其各种变化形式的字典进行密码破解。因此,一些类似于单词的密码可能会比上面的字符串更快被破解;而由 6 个字符组成的不像单词的密码可能不会被破解,也可能会被破解。

    双向加密

    PGP 加密函数

    PGP 加密函数实现了 OpenPGP(RFC 4880)标准中的加密功能,包括对称密钥加密(私钥加密)和非对称密钥加密(公钥加密)。

    一个加密后的 PGP 消息由 2 部分(包)组成:

    • 一个包含会话密钥(加密后的对称密钥或者公钥)的包;
    • 一个使用会话密钥对数据加密后的包。

    对于对称密钥(也就是口令)加密:

    1. 使用 String2Key(S2K)算法对密钥进行加密,类似于执行一个特意减慢并且包含随机 salt 的 crypt() 算法,生成一个完整长度的二进制密钥。
    2. 如果要求使用一个单独的会话密钥,生成一个随机的密钥;否则,使用上面的 S2K 密钥直接作为会话密钥。
    3. 如果直接使用 S2K 密钥,只将 S2K 设置加入会话密钥包中;否则,使用 S2K 密钥对会话密钥进行加密,然后放入会话密码包中。

    对于公钥加密:

    1. 生成一个随机的会话密钥。
    2. 使用公钥对其进行加密后放入会话密钥包中。

    无论哪种情况,对于数据的加密过程如下:

    1. 执行可选的数据操作:压缩、转换为 UTF-8 以及/或者换行符的转换。
    2. 在数据前面增加一个随机字节组成的块,相当于使用了一个随机的初始值(IV)。
    3. 计算随机前缀和数据的 SHA1 哈希值,追加到数据的后面。
    4. 将所有内容使用会话密钥进行加密后放入数据包中。

    pgp_sym_encrypt()函数用于对称密钥加密:

    pgp_sym_encrypt(data text, psw text [, options text ]) returns bytea
    pgp_sym_encrypt_bytea(data bytea, psw text [, options text ]) returns bytea
    

    其中,data 是要加密的数据;psw 是 PGP 对称密钥;options 参数用于设置选项,参考下文。

    pgp_sym_decrypt()函数用于解密 PGP 对称密钥加密后的消息:

    pgp_sym_decrypt(msg bytea, psw text [, options text ]) returns text
    pgp_sym_decrypt_bytea(msg bytea, psw text [, options text ]) returns bytea
    

    其中,msg 是要解密的消息;psw 是 PGP 对称密钥;options 参数用于设置选项,参考下文。为了避免输出无效的字符,不允许使用 pgp_sym_decrypt 函数对 bytea 数据进行解密;可以使用 pgp_sym_decrypt_bytea 对原始文本数据进行解密。

    pgp_pub_encrypt()函数用于公共密钥加密:

    pgp_pub_encrypt(data text, key bytea [, options text ]) returns bytea
    pgp_pub_encrypt_bytea(data bytea, key bytea [, options text ]) returns bytea
    

    其中,data 是要加密的数据;key 是 PGP 公钥,如果传入一个私钥将会返回错误;options 参数用于设置选项,参考下文。

    pgp_pub_decrypt()函数用于解密 PGP 公共密钥加密后的消息:

    pgp_pub_decrypt(msg bytea, key bytea [, psw text [, options text ]]) returns text
    pgp_pub_decrypt_bytea(msg bytea, key bytea [, psw text [, options text ]]) returns bytea
    

    其中,key 是公共密钥对应的私钥;如果私钥使用了密码保护功能,必须在 psw 参数中指定密码;如果没有使用密码保护,想要指定 options 参数时必须指定一个空的 psw。options 参数用于设置选项,参考下文。为了避免输出无效的字符,不允许使用 pgp_pub_decrypt 函数对 bytea 数据进行解密;可以使用 pgp_pub_decrypt_bytea 对原始文本数据进行解密。

    pgp_key_id()函数用于提取 PGP 公钥或者私钥的密钥 ID;如果传入一个加密后的消息,将会返回加密该消息使用的密钥 ID:

    pgp_key_id(bytea) returns text
    

    该函数可能返回 2 个特殊的密钥 ID:

    • SYMKEY,表明该消息使用对称密钥进行加密。
    • ANYKEY,表明该消息使用公共密钥进行加密,但是密钥 ID 已经被删除。这也意味着你需要尝试所有的私钥,查找可以解密该消息的私钥。pgcrypto 不会产生这种加密消息。

    注意,不同的密钥可能拥有相同的 ID,这种情况很少见但可能存在。客户端应用程序需要自己尝试使用不同的密钥进行解密,就像处理 ANYKEY 一样。

    armor()函数用于将二进制数据转换为 PGP ASCII-armor 格式,相当于 Base64 加上 CRC 以及额外的格式化。dearmor()函数用于执行相反的转换:

    armor(data bytea [ , keys text[], values text[] ]) returns text
    dearmor(data text) returns bytea
    

    其中,data 是需要转换的数据;如果指定了 keys 和 values 数值,每个 key/value 对都会生成一个 armor header 并添加到编码格式中;两个数组都是一维数组,长度相同,并且不能包含非 ASCII 字符。

    pgp_armor_headers()函数用于返回数据中的 armor header:

    pgp_armor_headers(data text, key out text, value out text) returns setof record
    

    返回结果是一个包含 key 和 value 两个字段的数据行集,如果其中包含任何非 ASCII 字符,都会被看作 UTF-8 字符。

    下面我们来看一个实例,首先为 users 表增加一个信用卡字段:

    ALTER TABLE users ADD COLUMN card bytea UNIQUE;
    

    然后我们需要生成 PGP 密钥,对于 Linux 操作系统可以使用 gpg 工具,对于 Windows 系统可以下载 GnuPG。执行以下命令创建一个新的密钥:

    gpg --gen-key
    

    然后按照提示输入相关信息。推荐使用 DSA and Elgamal 密钥;对于 RSA 加密,必须创建一个仅用于签名的 DSA 或者 RSA 密钥作为主控密钥,然后使用 gpg --edit-key 增加一个 RSA 加密子密钥。

    然后可以使用 gpg --list-secret-keys 查看创建的密钥:

    gpg --list-secret-keys
    
    /root/.gnupg/secring.gpg
    ------------------------
    sec   2048R/92A1CA53 2020-10-15
    uid                  tonydong (good luck) <tony.dong@163.com>
    ssb   2048R/4A973FF0 2020-10-15
    

    其中,2048R 是密钥的比特长度, 92A1CA53 是私钥,4A973FF0 是公钥。

    将公钥和私钥转换为 ASCII-armor 格式:

    gpg -a --export 4A973FF0 > public.key
    
    gpg -a --export-secret-keys 92A1CA53 > secret.key
    

    其中,-a 表示 armour 格式;默认的密钥是二进制格式,不方便处理。在使用 pgcrypto PGP 加密/解密函数时需要利用 dearmor() 函数将密钥转换为二进制再传入参数;如果可以直接处理二进制数据,也可以去掉 -a 选项。

    📝更多关于 GnuPG 的使用信息,可以参考The GNU Privacy Handbook 或者其他文档

    直接查看公钥 public.key 的内容如下:

    -----BEGIN PGP PUBLIC KEY BLOCK-----
    Version: GnuPG v2.0.22 (GNU/Linux)
    
    mQENBF+H26ABCACZ69PvxKPxPxPAXUAUT6xVvcrlkXQfCUccIVtoLx5YnhrJ8Itp
    xu+hRB4XD7ZOA37PxZQi/3NPxxtAyhXOKuhITiqPSMDWblLWAnIC2ZANseNrqPA7
    /yTdmQNT3cOk/MIqhBgF7f4O5JTfxvNdPeAxn+y5wxzUL+vpDXTlzeNNSMX41ukM
    DexBFbiORLv992ACq56KnKDkOJgt82eMENL87Kac0/few5RHb/SrQLHQjpBVU7es
    XL3ihernBA3bD/LpC5+pv3sC468NsOWGoevGSxkqprJ4mrsW7zSvZCyPmhWZz5Ra
    zUrgPNvzmG8NRe/ZE1GwQwTTIozjzZXKCf4jABEBAAG0KHRvbnlkb25nIChnb29k
    IGx1Y2spIDx0b255LmRvbmdAaWd0LmNvbT6JATkEEwECACMFAl+H26ACGwMHCwkI
    BwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAKCRB0hYKKkqHKU4auB/wKHey1k4xnYLX1
    I2GJL9Huj8dgp1LzUf+mgfgqkNPPJtDOk27gcCpi2lCelLhLAAM3KLVhtr9na6wk
    YlH9DFod59dwZ18gKJyMstfDg40pmjQz5QZhWkPIoPRvCGQ2XA2PVWbLNH3eMXC8
    n6VTLybFiMb+PJG80to9Rmez51XPxA5+NCX+X/KLESm2Zngafsm5Rw/nR5ne9Qcr
    jW4uKG8RZqp4lVh7NTnwsKdMu9BC4i4yqwh16IT506ibl7e3BLb+hMgENjzp871k
    YlQbRxQpToaIaMyrWmWiT9TZ6kXd8euB6DhdH8pjRLqpmF/V0pjVVY8bwsw16Keg
    7LBGr2zyuQENBF+H26ABCACuBYd+cDkAnjV91QX5BtnIcuWvhLr4q3t4oZnPQE7K
    70AcnXMTu6YTjs80/Ds5d7NAn7ZPsSRGOxChsT7F+VviTsP0LzrH9cXxa3jLCSr0
    k0hpWCKPOCHmDrS1kiOMw3b7Q+6ooOmlCBu+wZbkVSUWM9vud24zXqDWZZ9ssFh1
    vxh0IaAUWUV9wTmTeMK6TGhAcG9/78r60P2MRKWrvU6AZRTwDa3HmnR91Y/MUmvE
    ZuGuKCxFdL4d3647vemvWQM2zSLCJUfwvVPT9C7UsghRG1V24POE/sHDOe/gpyNE
    7WXgfkFZRLIoSwoFdnETX0HYYzcodK6B+S7Q7qN7m3nbABEBAAGJAR8EGAECAAkF
    Al+H26ACGwwACgkQdIWCipKhylMwbQf/foXSHwXhvBQ5ddF2eToz3rhH4RdIpJA2
    EtOoIN37p0Svafz/j9BMDMAaA1TK0H8wuqALI92LK+EgYQJdi9JSjruKLjNq3IHm
    7KP1CdP7Rvfk1TKKpj7gAeIsb7YOvZc1jb2QPurq7ehsJdlLTq8gf43NlvTd7a8c
    O20nRVLAv97BEylJKFCcazpTfQTknDkdx7v/XFWEwUbw/Ex1BCpQjqRITNroAMt4
    ZKtOt6bQ7hwiIuoFeZaEX3IRhqbaSyGukCav6TGFXytIO0iKjT0/pNcXonCisQ+C
    mKeM4pyVJLHW/a8Rv3UrKBv7f/avuQ2IRkf2xAr2JbeWyaLCi4x7Hg==
    =4f0y
    -----END PGP PUBLIC KEY BLOCK-----
    

    为了方便处理,可以创建一个存储公钥的表 keys:

    CREATE TABLE keys(v text);
    INSERT INTO keys VALUES ('');
    

    把 public.key 的内容替换到 INSERT 语句,将公钥插入该表中。

    接下来我们就可以将信用卡号进行加密存储:

    UPDATE users
    SET card = pgp_pub_encrypt('62220001', dearmor(keys.v))
    FROM keys
    WHERE username = 'tony';
    
    SELECT card
    FROM users
    WHERE username = 'tony';
    card                                                                                                                                                                                                                                                           |
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
    ÁÀL ;pFuJ ?ð   L  G£âC  òÔðã  ±  ± í äÝ´#B =ÂÅe  3N  W³ ë$e}U;÷ jv(·  /Û'\k¥Î C nîö 3ç§ õ 6i IØ*Å¿  K  * à  _4ô Éa  ¬U  z* éú© F mv .íÞ§'å n  D^Y ½j° i9/ ø ¤ =[ £U  y·  w ¨LáN¿ Á4{ (Ï»m@ ¥ r ÝC\ý  ÎcGg üñG Q© oµWX õ s ð   ½^/ @Ï TÒOÁ¦0 ï>UÖHÐ 6µ} ¦  I 2  |
    

    查询结果显示 card 字段已经被加密存储。

    我们可以使用 pgp_key_id() 函数验证加密使用的公钥:

    SELECT pgp_key_id(card)
    FROM users
    WHERE username = 'tony';
    pgp_key_id      |
    ----------------|
    3B7046754A973FF0|
    
    SELECT pgp_key_id(dearmor(v))
    FROM keys;
    pgp_key_id      |
    ----------------|
    3B7046754A973FF0|
    

    应用程序可以通过私钥 secret.key 解密信用卡号:

    SELECT pgp_pub_decrypt(card, dearmor('-----BEGIN PGP PRIVATE KEY BLOCK-----
    ...
    -----END PGP PRIVATE KEY BLOCK-----'), '1234567890')
    FROM users
    WHERE username = 'tony';
    pgp_pub_decrypt|
    ---------------|
    62220001       |
    

    其中,1234567890 是创建密钥时输入的口令。

    注意,PGP 代码存在以下限制:

    • 不支持签名。这也意味着它不会检查加密子密钥是否属于主控密钥。
    • 不支持加密密钥作为主控密钥。由于通常并不鼓励这种做法,因此这应该不是问题。
    • 不支持多个子密钥。由于实际应用中经常需要多个子密钥,这可能是个问题。另一方面,不要使用常规 GPG/PGP 密钥作为 pgcrypto 加密密钥,而应该创建新的密钥,因为这是非常不同的使用场景。

    PGP 函数选项

    pgcrypto 函数中的选项名称和 GnuPG 类似,选项的值使用等号设置,每个选项使用逗号进行分隔。例如:

    pgp_sym_encrypt(data, psw, 'compress-algo=1, cipher-algo=aes256')
    

    除了 convert-crlf 之外,其他选项仅适用于加密函数。解密函数从 PGP 数据中获取参数。

    最常设置的选项包括 compress-algo 和 unicode-mode,其他选项通常使用默认值。

    选项描述取值适用函数
    cipher-algo使用的密码算法。bf、aes128(默认值)、aes192、aes256;使用 OpenSSL 时还支持:3des、cast5pgp_sym_encrypt、pgp_pub_encrypt
    compress-algo使用的压缩算法,只有编译 PostgreSQL 时使用了 zlib 参数可用。0,不压缩,默认值;1,ZIP 压缩;2,ZLIB 压缩(ZIP 加上元数据和 CRC)pgp_sym_encrypt、pgp_pub_encrypt
    compress-level压缩级别,级别越高结果越小但速度更慢,0 表示不压缩0、1-9,默认为 6pgp_sym_encrypt、pgp_pub_encrypt
    convert-crlf加密时是否将 \n 转换为 \r\n 并且解密时执行相反的转换,RFC 4880 指定文本数据需要使用 \r\n 作为换行符。0(默认值)、1pgp_sym_encrypt、pgp_pub_encrypt
    pgp_sym_decrypt、pgp_pub_decrypt
    disable-mdc不使用 SHA-1 保护数据,仅用于兼容古老的 PGP 产品。0(默认值)、1pgp_sym_encrypt、pgp_pub_encrypt
    sess-key使用单独的会话密钥。公钥加密总是使用单独的会话密钥;该选项用于对称密钥加密,因为它默认直接使用 S2K 密钥。0(默认值)、1pgp_sym_encrypt
    s2k-mode使用的 S2K 算法。0,不使用 salt,危险;1,使用 salt 但是迭代固定次数;3(默认值),使用 salt 同时迭代次数可变。pgp_sym_encrypt
    s2k-countS2K 算法的迭代次数。大于等于 1024 并且小于等于 65011712,默认为 65536 到 253952 之间的随机数。pgp_sym_encrypt 并且 s2k-mode=3
    s2k-digest-algoS2K 计算时的摘要算法。md5、sha1(默认值)pgp_sym_encrypt
    s2k-cipher-algo加密单独会话密钥时使用的密码。bf、aes、aes128、aes192、aes256,默认使用 cipher-algo 的算法。pgp_sym_encrypt
    unicode-mode是否将文本数据在数据库内部编码和 UTF-8 之间来回转换。如果数据库已经是 UTF-8、不会执行转换,但是消息将被标记为 UTF-8;如果没有指定这个选项就不会被标记。0(默认值)、1pgp_sym_encrypt、pgp_pub_encrypt

    原始加密函数

    原始加密函数仅仅会对数据进行一次加密,不支持 PGP 加密的任何高级功能,因此存在以下主要问题:

    1. 直接将用户密钥作为加密密钥。
    2. 不提供任何完整性检查校验加密后的数据是否被修改。
    3. 需要用户自己关联所有的加密参数,包括初始值(IV)。
    4. 不支持文本数据。

    因此,在引入了 PGP 加密之后,不建议使用这些原始加密函数

    encrypt(data bytea, key bytea, type text) returns bytea
    decrypt(data bytea, key bytea, type text) returns bytea
    
    encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
    decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
    

    其中,data 是需要加密的数据;type 用于指定加密方法。type 参数的语法如下:

    algorithm [ - mode ] [ /pad: padding ]
    

    其中 algorithm 的可能取值如下:

    • bf,Blowfish 算法
    • aes,AES 算法(Rijndael-128、-192 或者-256)

    mode 的可能取值如下:

    • cbc,下一个块依赖于前一个块(默认值)
    • ecb,每个块独立加密(仅用于测试)

    padding 的可能取值如下:

    • pkcs,数据可以是任意长度(默认值)
    • none,数据长度必须是密码块大小的倍数

    例如,以下函数的加密结果相同:

    encrypt(data, 'fooz', 'bf')
    encrypt(data, 'fooz', 'bf-cbc/pad:pkcs')
    

    对于函数 encrypt_iv 和 decrypt_iv,参数 iv 表示 CBC模式的初始值,ECB 模式忽略该参数。如果它的长度不是准确的块大小,可能会被截断或者使用 0 进行填充。对于没有该参数的两个函数,默认全部使用 0 填充。

    随机数据函数

    gen_random_bytes()函数用于生成具有强加密性的随机字节:

    gen_random_bytes(count integer) returns bytea
    

    其中,count 表示返回的字节数,取值从 1 到 1024。例如:

    SELECT encode(gen_random_bytes(16), 'hex');
    encode                          |
    --------------------------------|
    8f8ac42ff5cbb82637f8dd8e653328e1|
    

    gen_random_uuid()函数用于返回一个 version 4 的随机 UUID,从 PostgreSQL 13 开始成为了一个内置函数:

    SELECT gen_random_uuid();
    gen_random_uuid                     |
    ------------------------------------|
    69657400-23b1-4ee6-9f37-fbcad4c9562c|
    

    其他事项

    pgcrypto 配置

    pgcrypto 可以根据 PostgreSQL 编译时的 configure 脚本进行自我配置,相关的选项包括 --with-zlib 以及 --with-openssl。

    如果编译时使用了 zlib 选项,PGP 加密函数可以在加密之前对数据进行压缩。如果编译时使用了 OpenSSL 选项,PGP 加密函数可以支持更多的算法;同时公钥加密函数速度会更快,因为 OpenSSL 提供了优化的 BIGNUM 函数。下表比较了使用或者不使用 OpenSSL 时支持的功能:

    支持功能内置OpenSSL
    MD5✔️✔️
    SHA1✔️✔️
    SHA224/256/384/512✔️✔️
    其他摘要算法✔️ (1)
    Blowfish✔️✔️
    AES✔️✔️
    DES/3DES/CAST5✔️
    原始加密✔️✔️
    PGP 对称加密✔️✔️
    PGP 公钥加密✔️✔️

    备注 1:OpenSSL 支持的任何摘要算法都是自动选择的;无法支持密码。

    NULL 处理

    所有函数都遵循 SQL 表中,如果任何参数为 NULL,结果返回 NULL。如果使用时不小心,可能会造成安全风险。

    安全限制

    所有的 pgcrypto 函数都在数据库服务器中运行,意味着数据和密码在客户端和 pgcrypto 之间使用明文进行传输。因此我们必须:

    • 使用本地连接或者 SSL 连接;
    • 信任系统管理员和数据库管理员。

    如果无法做到以上两点,一个更好的方式就是在客户端应用程序中完成加密/解密。

    另外,pgcrypto 的实现无法抵抗旁路攻击(Side Channel Attacks)。例如,对于指定大小的不同密文,pgcrypto 解密函数所需的时间不同。

    关于 pgcrypto 模块的更多信息可以参考 PostgreSQL 官方文档

    展开全文
  • PostgreSQL 数据安全之数据加密

    千次阅读 2021-09-01 10:23:17
    PostgreSQL 支持多个不同级别的灵活加密技术,包括密码加密、字段加密、存储加密、传输加密、认证加密以及应用加密,可以保护数据不因数据库服务器被盗、内部管理员或者不安全的网络传输而导致泄露。

    大家好,我是只谈技术不剪发的 Tony 老师。

    《中华人民共和国数据安全法》自 2021 年 9 月 1 日开始实施,这是我国第一部有关数据安全的专门法律。与此同时,《中华人民共和国个人信息保护法》也将于 2021 年11月1日起施行。相关法律的陆续出台,意味着国家对于信息安全保护制度的完善,同时也对存储和处理数据的企业和组织提出了更高的要求。

    数据库作为存储电子数据的主要方式,需要通过加密技术保护敏感数据,如个人医疗记录或金融交易数据。本文给大家介绍一些 PostgreSQL 提供的加密技术。PostgreSQL 支持多个不同级别的灵活加密技术,可以保护数据不因数据库服务器被盗、内部管理员或者不安全的网络传输而导致泄露。

    密码加密

    PostgreSQL 支持用户密码的加密存储(加密方式由 password_encryption 参数决定),确保数据库管理员无法得到用户的密码。

    如果我们采用了 SCRAM 或者 MD5 加密的客户端认证,明文密码甚至不会在服务器中出现,因为客户端在发送之前就已经进行了密码加密。推荐使用 SCRAM 加密,因为它是一个互联网标准,而且比 PostgreSQL 使用的 MD5 认证协议更安全。

    注意,某些旧的客户端可能不支持 SCRAM 认证机制,因此无法使用 SCRAM-SHA-256 加密后的密码。关于密码认证的详细信息可以参考官方文档

    字段加密

    PostgreSQL pgcrypto 模块可以用于加密指定字段。这种方式对于敏感数据的包含非常有用。查询数据时,客户端提供解密密钥,数据在服务器端解密后发送给客户端。

    解密后的数据和解密密钥在解密以及传输过程中会在服务器中短暂存在,这一短暂时刻可能导致拥有数据库服务器完全访问权限的用户(例如系统管理员)拦截获取数据和密钥。

    存储加密

    存储加密可以在文件系统级别或者块级别实现。Linux 文件系统加密选项包括 eCryptfs 和 EncFS,FreeBSD 使用 PEFS 加密技术。块级别或者整盘加密选项包括 Linux 操作系统的 dm-crypt + LUKS ,以及 FreeBSD 操作系统的 GEOM 模块 geli 和 gbde。包括 Windows 在内的许多其他操作系统都支持加密功能。

    存储加密技术可以防止计算机被盗后未加密数据的泄露。这种方式无法组织文件系统加载之后的攻击,因为一旦加载文件系统,操作系统就提供了一个未加密的数据视图。尽管如此,为了能够加载文件系统,用户必须采用某种方式将加密密钥传递给操作系统,有时候密钥就存储在加载磁盘的主机中。

    传输加密

    SSL 连接可以加密网络传输中的所有数据,包括:密码、查询语句以及返回的结果。pg_hba.conf 配置文件可以允许管理员指定哪些主机可以使用非加密连接(host),以及哪些主机需要使用 SSL 加密连接(hostssl)。同时,客户端可以指定只通过 SSL 连接到服务器。

    GSSAPI 加密连接可以加密网络传输中的所有数据,包括查询语句和返回的结果(密码不会通过网络传输)。pg_hba.conf 配置文件可以允许管理员指定哪些主机可以使用非加密连接(host),以及哪些主机需要使用 GSSAPI 加密连接(hostgssenc)。同时,客户端可以指定只通过 SSL 连接到服务器(gssencmode=require)。

    除此之外,Stunnel 或者 SSH 也可用于加密传输。

    认证加密

    PostgreSQL 客户端和服务器都可以提供相互的 SSL 认证。认证加密需要客户端和服务器的一些额外配置,但是可以提供比密码更安全的身份认证。

    认证加密可以防止机器伪装成数据库服务器读取客户端发送的密码,同时也可以防止“中间人”攻击,也就是在客户端和服务器中间的机器伪装成服务器读取和传递它们之间的所有数据。

    应用加密

    如果数据库服务器的管理员不可信,需要使用客户端加密技术。这样的话明文数据首先会在客户端应用中进行加密,网络中传输的就是密文数据,数据库中不会出现明文数据。这种方式也被称为全加密数据库解决方案。

    全加密数据库
    【图片来源:阿里云】

    注意,这种方式查询的数据结果需要在客户端应用中进行解密后才能使用,无法在数据库中使用 SQL 进行操作。

    如果你觉得文章有用,欢迎扫一扫:

    在这里插入图片描述

    展开全文
  • 数据加密原理详解

    千次阅读 2019-11-29 11:05:36
    数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。 数据加密仍是计算机系统对信息进行保护的一种最可靠的办法。...

    数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。
    数据加密仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息的安全的作用。

    一、基本信息

    简介
    和防火墙配合使用的数据加密技术,是为提高信息系统和数据的安全性和保密性,防止秘密数据被外部破译而采用的主要技术手段之一。在技术上分别从软件和硬件两方面采取措施。按照作用的不同,数据加密技术可分为数据传输加密技术、数据存储加密技术、数据完整性的鉴别技术和密钥管理技术。
    数据传输加密技术的目的是对传输中的数据流加密,通常有线路加密与端—端加密两种。线路加密侧重在线路上而不考虑信源与信宿,是对保密信息通过各线路采用不同的加密密钥提供安全保护。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。
    数据存储加密技术的目的是防止在存储环节上的数据失密,数据存储加密技术可分为密文存储和存取控制两种。前者一般是通过加密算法转换、附加密码、加密模块等方法实现;后者则是对用户资格、权限加以审查和限制,防止非法用户存取数据或合法用户越权存取数据。
    数据完整性鉴别技术的目的是对介入信息传送、存取和处理的人的身份和相关数据内容进行验证,一般包括口令、密钥、身份、数据等项的鉴别。系统通过对比验证对象输入的特征值是否符合预先设定的参数,实现对数据的安全保护。
    密钥管理技术包括密钥的产生、分配、保存、更换和销毁等各个环节上的保密措施。
    基本概念
    数据加密的术语有:
    明文,即原始的或未加密的数据。通过加密算法对其进行加密,加密算法的输入信息为明文和密钥;
    密文,明文加密后的格式,是加密算法的输出信息。加密算法是公开的,而密钥则是不公开的。密文不应为无密钥的用户理解,用于数据的存储以及传输;
    密钥,是由数字、字母或特殊符号组成的字符串,用它控制数据加密、解密的过程;
    加密,把明文转换为密文的过程;
    加密算法,加密所采用的变换方法;
    解密,对密文实施与加密相逆的变换,从而获得明文的过程;
    解密算法,解密所采用的变换方法。
    加密技术是一种防止信息泄露的技术。它的核心技术是密码学,密码学是研究密码系统或通信安全的一门学科,它又分为密码编码学和密码分析学。
    任何一个加密系统都是由明文、密文、算法和密钥组成。发送方通过加密设备或加密算法,用加密密钥将数据加密后发送出去。接收方在收到密文后,用解密密钥将密文解密,恢复为明文。在传输过程中,即使密文被非法分子偷窃获取,得到的也只是无法识别的密文,从而起到数据保密的作用。
    数据加密

    例:明文为字符串:
    AS KINGFISHERS CATCH FIRE
    (为简便起见,假定所处理的数据字符仅为大写字母和空格符)。假定密钥
    为字符串:ELIOT
    

    加密算法为:

    1. 将明文划分成多个密钥字符串长度大小的块(空格符以"+"表示)
      AS+KI NGFIS HERS+ CATCH +FIRE
    2. 用0~26范围的整数取代明文的每个字符,空格符=00,A=01,…,Z=26:
    3. 与步骤2一样对密钥的每个字符进行取代:
      0512091520
    4. 对明文的每个块,将其每个字符用对应的整数编码与密钥中相应位置的字符的整数编码的和模27后的值(整数编码)取代:
      举例:第一个整数编码为 (01+05)%27=06
    5. 将步骤4的结果中的整数编码再用其等价字符替换:
      FDIZB SSOXL MQ+GT HMBRA ERRFY
      如果给出密钥,该例的解密过程很简单。问题是对于一个恶意攻击者来说,在不知道密钥的情况下,利用相匹配的明文和密文获得密钥究竟有多困难?对于上面的简单例子,答案是相当容易的,不是一般的容易,但是,复杂的加密模式同样很容易设计出。理想的情况是采用的加密模式使得攻击者为了破解所付出的代价应远远超过其所获得的利益。实际上,该目的适用于所有的安全性措施。这种加密模式的可接受的最终目标是:即使是该模式的发明者也无法通过相匹配的明文和密文获得密钥,从而也无法破解密文。
      数据加密标准
      传统加密方法有两种,替换和置换。上面的例子采用的就是替换的方法:使用密钥将明文中的每一个字符转换为密文中的一个字符。而置换仅将明文的字符按不同的顺序重新排列。单独使用这两种方法的任意一种都是不够安全的,但是将这两种方法结合起来就能提供相当高的安全程度。数据加密标准(Data Encryption Standard,简称DES)就采用了这种结合算法,它由IBM制定,并在1977年成为美国官方加密标准。
      DES的工作原理为:将明文分割成许多64位大小的块,每个块用64位密钥进行加密,实际上,密钥由56位数据位和8位奇偶校验位组成,因此只有56个可能的密码而不是64个。每块先用初始置换方法进行加密,再连续进行16次复杂的替换,最后再对其施用初始置换的逆。第i步的替换并不是直接利用原始的密钥K,而是由K与i计算出的密钥Ki。
      DES具有这样的特性,其解密算法与加密算法相同,除了密钥Ki的施加顺序相反以外。
      公开密钥加密
      多年来,许多人都认为DES并不是真的很安全。事实上,即使不采用智能的方法,随着快速、高度并行的处理器的出现,强制破解DES也是可能的。"公开密钥"加密方法使得DES以及类似的传统加密技术过时了。公开密钥加密方法中,加密算法和加密密钥都是公开的,任何人都可将明文转换成密文。但是相应的解密密钥是保密的(公开密钥方法包括两个密钥,分别用于加密和解密),而且无法从加密密钥推导出,因此,即使是加密者若未被授权也无法执行相应的解密。
      公开密钥加密思想最初是由Diffie和Hellman提出的,最著名的是Rivest、Shamir以及Adleman提出的,通常称为RSA(以三个发明者的首位字母命名)的方法,该方法基于下面的两个事实:
    1) 已有确定一个数是不是质数的快速算法;
    2) 尚未找到确定一个合数的质因子的快速算法。
    RSA方法的工作原理如下:
    1) 任意选取两个不同的大质数p和q,计算乘积r=p*q;
    2) 任意选取一个大整数e,e与(p-1)*(q-1)互质,整数e用做加密密钥。注意:e的选取是很容易的,例如,所有大于p和q的质数都可用。
    3) 确定解密密钥d:
    (d * e) modulo(p - 1)*(q - 1) = 1
    根据e、p和q可以容易地计算出d。
    4) 公开整数r和e,但是不公开d;
    5) 将明文P (假设P是一个小于r的整数)加密为密文C,计算方法为:
    C = P^e modulo r
    6) 将密文C解密为明文P,计算方法为:
    P = C^d modulo r
    然而只根据r和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密。
    

    下面举一简单的例子对上述过程进行说明,显然我们只能选取很小的数字。

    例:选取p=3, q=5,则r=15,(p-1)*(q-1)=8。选取e=11(大于p和q的质数),通过(d*11)modulo(8) = 1。
    计算出d =3。
    假定明文为整数13。则密文C为
    C = P^e modulo r
    = 13^11 modulo 15
    = 1,792,160,394,037 modulo 15
    = 7
    复原明文P为:
    P = C^d modulo r
    = 7^3 modulo 15
    = 343 modulo 15
    = 13
    

    透明数据加密
    因为e和d互逆,公开密钥加密方法也允许采用这样的方式对加密信息进行"签名",以便接收方能确定签名不是伪造的。假设A和B希望通过公开密钥加密方法进行数据传输,A和B分别公开加密算法和相应的密钥,但不公开解密算法和相应的密钥。A和B的加密算法分别是ECA和ECB,解密算法分别是DCA和DCB,ECA和DCA互逆,ECB和DCB互逆。若A要向B发送明文P,不是简单地发送ECB(P),而是先对P施以其解密算法DCA,再用加密算法ECB对结果加密后发送出去。
    密文C为:
    C = ECB(DCA(P))
    B收到C后,先后施以其解密算法DCB和加密算法ECA,得到明文P:
    ECA(DCB(C))
    = ECA(DCB(ECB(DCA(P))))
    = ECA(DCA(P)) /DCB和ECB相互抵消/
    = P /DCB和ECB相互抵消/
    这样B就确定报文确实是从A发出的,因为只有当加密过程利用了DCA算法,用ECA才能获得P,只有A才知道DCA算法,没
    有人,即使是B也不能伪造A的签名。
    加密行业状况
    前言
    随着信息化的高速发展,人们对信息安全的需求接踵而至,人才竞争、市场竞争、金融危机、敌特机构等都给企事业单位的发展带来巨大风险,内部窃密、黑客攻击、无意识泄密等窃密手段成为了人与人之间、企业与企业之间、国与国之间的安全隐患。
    市场的需求、人的安全意识、环境的诸多因素促使着我国的信息安全高速发展,信息安全经历了从传统的单一防护如防火墙到信息安全整体解决方案、从传统的老三样防火墙、入侵检测、杀毒软件到多元化的信息安全防护、从传统的外部网络防护到内网安全、主机安全等。
    传统数据加密技术分析
    信息安全传统的老三样(防火墙、入侵检测、防病毒)成为了企事业单位网络建设的基础架构,已经远远不能满足用户的安全需求,新型的安全防护手段逐步成为了信息安全发展的主力军。例如主机监控、文档加密等技术。
    在新型安全产品的队列中,主机监控主要采用外围围追堵截的技术方案,虽然对信息安全有一定的提高,但是因为产品自身依赖于操作系统,对数据自身没有有效的安全防护,所以存在着诸多安全漏洞,例如:最基础的手段拆拔硬盘、winpe光盘引导、USB引导等方式即可将数据盗走,而且不留任何痕迹;此技术更多的可以理解为企业资产管理软件,单一的产品无法满足用户对信息安全的要求。
    文档加密是现今信息安全防护的主力军,采用透明加解密技术,对数据进行强制加密,不改变用户原有的使用习惯;此技术对数据自身加密,不管是脱离操作系统,还是非法脱离安全环境,用户数据自身都是安全的,对环境的依赖性比较小。市面上的文档加密主要的技术分为磁盘加密、应用层加密、驱动级加密等几种技术,应用层加密因为对应用程序的依赖性比较强,存在诸多兼容性和二次开发的问题,逐步被各信息安全厂商所淘汰。
    当今主流的两大数据加密技术
    我们所能常见到的主要就是磁盘加密和驱动级解密技术:
    全盘加密技术是主要是对磁盘进行全盘加密,并且采用主机监控、防水墙等其他防护手段进行整体防护,磁盘加密主要为用户提供一个安全的运行环境,数据自身未进行加密,操作系统一旦启动完毕,数据自身在硬盘上以明文形式存在,主要靠防水墙的围追堵截等方式进行保护。磁盘加密技术的主要弊端是对磁盘进行加密的时间周期较长,造成项目的实施周期也较长,用户一般无法忍耐;磁盘加密技术是对磁盘进行全盘加密,一旦操作系统出现问题。需要对数据进行恢复也是一件让用户比较头痛的事情,正常一块500G的硬盘解密一次所需时间需要3-4个小时;市面上的主要做法是对系统盘不做加密防护,而是采用外围技术进行安全访问控制,大家知道操作系统的版本不断升级,微软自身的安全机制越来越高,人们对系统的控制力度越来越低,尤其黑客技术层层攀高,一旦防护体系被打破,所有一切将暴露无疑。另外,磁盘加密技术是对全盘的信息进行安全管控,其中包括系统文件,对系统的效率性能将大大影响。
    驱动级技术是信息加密的主流技术,采用进程+后缀的方式进行安全防护,用户可以根据企事业单位的实际情况灵活配置,对重要的数据进行强制加密,大大提高了系统的运行效率。驱动级加密技术与磁盘加密技术的最大区别就是驱动级技术会对用户的数据自身进行保护,驱动级加密采用透明加解密技术,用户感觉不到系统的存在,不改变用户的原有操作,数据一旦脱离安全环境,用户将无法使用,有效提高了数据的安全性;另外驱动级加密技术比磁盘加密技术管理可以更加细粒度,有效实现数据的全生命周期管理,可以控制文件的使用时间、次数、复制、截屏、录像等操作,并且可以对文件的内部进行细粒度的授权管理和数据的外出访问控制,做到数据的全方位管理。驱动级加密技术在给用户的数据带来安全的同时,也给用户的使用便利性带来一定的问题,驱动级加密采用进程加密技术,对同类文件进行全部加密,无法有效区别个人文件与企业文件数据的分类管理,个人电脑与企业办公的并行运行等问题。

    二、数据加密方法

    异或
    异或算法的好处便是数A和数B异或后,把结果再和数A异或便可得到B,或者和数B异或可重新得到数据A。利用异或的这个特性可简单实现数据的加密和解密算法。
    构建加密机加密
    加密机实际上便是异或中的其中一个数,可以根据自己的需要随意构建。

    三、加密技术

    对称加密技术
    对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,密钥较短,且破译困难,除了数据加密标准(DES),另一个对称密钥加密系统是国际数据加密算法(IDEA),它比DES的加密性好,而且对计算机功能要求也没有那么高。IDEA加密标准由PGP(Pretty Good Privacy)系统使用。
    非对称加密技术
    1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”。相对于“对称加密算法”这种方法也叫做“非对称加密算法”。与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密 (privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

    展开全文
  • 前端敏感数据加密方案及实现

    千次阅读 多人点赞 2020-10-18 22:30:08
    本文首发于政采云前端团队博客:敏感数据加密方案及实现https://www.zoo.team/article/data-encryption前言现在是大数据时代,需要收集大量的个人信息用...
  • 常用数据加密算法

    千次阅读 2019-01-10 14:34:46
    假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。 对称加密算法的安全性...
  • 简述接口数据安全的主要实现方式 一:数据校验 常用算法:MD5,SHA1 流程: 1:前端生成数据后按照约定方式生成一个sign 校验字段(一般通过MD5或者SHA1 方式),一并提交给后端; 2:后端获得参数后通过同样的方式生成sign ...
  • 常用数据加密和解密方法

    万次阅读 2018-07-17 13:54:07
    关键词:数据加密用哪种方式更好? ASP.NET(C#)常用数据加密和解密方法汇总  一、数据加密的概念 1、 基本概念 2、 基本功能 3、 加密形式  二、 数据加密的项目应用和学习 1、 媒体加密:DRM 2、 ...
  • 客户端与服务端数据加密传输方案

    万次阅读 多人点赞 2019-03-03 17:39:42
    从前一篇网络安全基础要点知识介绍中可以知道,在网络通信中数据容易被截取或篡改等,那么如果在传输用户隐私数据过程中,被不法分子截取或篡改,就容易导致用户受到伤害,所以对客户端与服务端的传输数据加密,是...
  • C语言编程之数据加密

    千次阅读 2019-03-15 10:33:42
    问题描述:某公司采用内部公用电话来传递数据数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。 程序...
  • Python基础之数据加密(收藏这一篇就够了!)

    千次阅读 热门讨论 2020-10-24 12:51:37
    Python基础之数据加密 文章目录Python基础之数据加密1. 准备工作2. MD5加密2.1 加密规则2.2 应用场景2.3 代码实例2.4 sha1 加密3. Base64加密3.1 加密规则:3.2 应用场景:3.3 代码实例4. AES5. RSA5.1 加密原理: 1...
  • SQL server 数据加密

    千次阅读 2019-08-18 09:53:31
    简介 加密是指通过使用密钥或...在SQL Server中,加密并不能替代其他的安全设置,可以当数据库破解或是备份被盗取后的最后一道防线,通过加密,未经授权的人在没有密匙或密码的情况下所窃取的数据变成毫无意义。 ...
  • cocos2d-x 实现3种数据加密方法的源码

    热门讨论 2013-06-24 14:51:27
    cocos2d-x 实现3种数据加密MD5/SHA1/BASE64源码
  • 数据加密方法及原理介绍

    千次阅读 2020-02-04 19:14:31
    一、加密术语 1、加密 透过数学公式运算,使文件或数据模糊化,将容易识别的明文变成不可识 别的密文 用于秘密通讯或安全存放文件及数据 ...使用同一把密钥对数据进行加密和解密 ,又称对称密钥 (Symmetric Ke...
  • 网络安全(通信加密、数据加密

    千次阅读 2021-09-28 21:04:00
    数据加密标准 DES、三重 DES、国际数据加密算法 IDEA 和 RC5 算法。 非对称机密(公钥加密) 概念 指收发双方使用不同密钥的密码,一个用来加密信息,一个用来解密信息,比私钥出现的晚一些。 优势 能适应网络的...
  • 请求接口返回数据加密Java

    千次阅读 2019-12-27 17:51:51
    请求接口返回数据加密 一,后台 1.引入pom.xml文件 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core</artifactId> <version>4.6...
  • 常用js数据加密

    万次阅读 2019-11-21 11:20:27
    常用js数据加密 原生js已经支持base64加密及解密 //加密 window.btoa(this.shop) //解密 window.atob(this.shop)
  • java 数据加密基本知识

    千次阅读 2019-01-21 15:20:44
    BASE64的加密解密是双向的,可以求反解. BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。 JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, ...
  • 数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。 一、加密的基本概念 “加密”,是一种...
  • MySQL数据加密与解密

    千次阅读 2019-06-29 16:11:45
    MySQL数据加密与解密 1.测试环境 MySQL 8.0 版本 .Net Framework 4.5.2 2.MySQL 自带的加密函数:aes_encrypt() 解密函数 aes_decrypt() 3.插入数据加密 INSERT INTO XXX VALUES(' aes_encrypt('加密的数据','...
  • 在网络传输重要信息或存储重要文件信息时,大部分会对数据加密,保证数据的安全性。互联网上流行的可逆加密方式对数据的安全性没有保证,便自己写了一套安全性极高加密、解密方法。 方法的实现方式及特点: 1....
  • MySQL数据加密

    千次阅读 2019-01-17 16:31:52
    – 一、AES加密 双向加密 加密强度更高 AES_ENCRYPT(‘明文’,‘加密key’); AES_DECRYPT(‘密文’,‘加密key’); – username varchar类型, username2 blob类型 INSERT INTO t_gw_test(id,username2,username) ...
  • Spring Data JPA 数据加密存储

    千次阅读 2019-05-11 10:15:55
    都能直接明了的看到用户所有的隐私数据,尤其在中小型公司中,对于数据库权限的管理基本上都是由开发人员直接进行维护管理,这样对于数据安全并不是一个好事,因此如果能将用户私密数据加密存储到数据库中,那么就能...
  • Oracle 透明数据加密TDE

    万次阅读 2015-05-25 15:35:09
    透明数据加密TDE   这可能是你的公司最恐怖的噩梦:有人偷走了数据库的备份磁带!当然,你可能构造了一个安全的系统,加密了最敏感的资产,然后围绕数据库服务器建了一圈防火墙来保护。但是,小偷却采取了最简单的...
  • 很多国企项目针对等保分保测评要求很高 加密算法 也是要符合国家密码局认定。针对 这个问题 公司决定使用SM4。 算法介绍: 无 无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无 反正...
  • C++:数据加密练习

    千次阅读 2019-01-19 12:47:38
    //【输入形式某个公司采用公用电话传递数据数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5, 然后再除以10的余数代替该数字, // 再将第一位和第四位交换,第二位和第三位交换。】输入...
  • Java数据加密Cipher介绍

    2019-03-07 16:15:06
    数字加密是安全体系中最重要的安全组件,数据加密可以保证数据的私密性。Cipher类为加密和解密提供密码功能,是Java Cryptographic Extension(JCE)框架的核心。在本系列中,讲解了数据加密的常见的相关概念,对...
  • Oracle 透明数据加密--列加密

    千次阅读 2018-03-29 14:33:00
    当用户插入或者更新数据时,列值会被截获、加密,然后用加密后的格式保存。然后,当这一列被查询时,又会自动对列值进行解密,然后把解密后的文本(明文)返回给用户。用户甚至都不需要知道发生过加密和解密——也...
  • uniapp 接口数据加密

    千次阅读 2020-04-27 13:59:37
    1、打开HBuilderX的视图->显示终端 cd 切换到你项目的根目录 执行命令 npm install crypto-js 安装成功后你的项目根目录会生成node_modules文件夹,里面有crypto-js就说明成功了 ...// DES加密 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 673,222
精华内容 269,288
关键字:

数据加密