sql数据加密有几种方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql数据加密有几种方法?相关的知识,希望对你有一定的参考价值。
对sql中的数据进行加密,有5种方法,
1、利用CONVERT改变编码方式:
利用该函数把文字或数据转换成VARBINARY。但该方式不具备保护数据的能力,仅避免浏览数据的过程中能直接看到敏感数据的作用。
2、利用对称密钥:
搭配EncryptByKey进行数据加密。使用DecryptByKey函数进行解密。这种方式比较适合大数据量。因为对称密钥的过程耗用资源较少。
3、利用非对称密钥:
搭配EncryptByAsymKey进行数据加密。使用DecryptByAsymKey函数进行解密。用于更高安全级别的加解密数据。因为耗用资源叫多。
4、利用凭证的方式:
搭配EncryptByCert进行加密和DecryptByCert函数进行解密。比较类似非对称密钥。
5、利用密码短语方式:
搭配EncryptBypassPhrase进行加密,使用DecryptByPassPhrase函数来解密。可以使用有意义的短语或其他数据行,当成加密、解密的关键字,比较适合一般的数据加解密。
扩展资料:
sql数据库的组成:
在正式学习SQL语言之前,首先让我们对SQL语言有一个基本认识,介绍一下SQL语言的组成:
1、一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义。
2、一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项。
3、一个表或者是一个基本表或者是一个视图。基本表是实际存储在数据库的表,而视图是由若干基本表或其他视图构成的表的定义。
4、一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表。每个存储文件与外部存储上一个物理文件对应。
5、用户可以用SQL语句对视图和基本表进行查询等操作。在用户角度来看,视图和基本表是一样的,没有区别,都是关系(表格)。
6、SQL用户可以是应用程序,也可以是终端用户。SQL语句可嵌入在宿主语言的程序中使用,宿主语言有FORTRAN,COBOL,PASCAL,PL/I,C和Ada语言等。
SQL用户也能作为独立的用户接口,供交互环境下的终端用户使用。
参考资料来源:百度百科-SQL数据库
参考技术A 在Sql Server 中经常要对存在表中数据加密,比如密码字段,我们可以利用Sql 中自带的加密函数pwdencrypt()来进行加密,加密之后无法解密码,需要使用pwdcompare('原文','密码')对比,如果返回结果为1,表示密码相符,如果为0,表示不符例如:
declare @pwd varchar(50)
declare @en_pwd varbinary(256)
select @pwd='abc'
select @en_pwd=pwdencrypt(@pwd)
select pwdcompare(@pwd,@en_pwd)
返回的结果为1,表示相符
这里还有一个小的细节要注意一下,pwdcompare()其实还有一个参数:
pwdcompare(@pwd,@en_pwd,1|0)
最后一个参数取1的时候,密码区分大小写的,不过默认是取0的,也就是加密之后,不区分大小写。
偶然间发现这样一篇贴子,说pwdencrypt()有漏洞,使用使用的时候还是小心为好。
描述:
Microsoft SQL Server 2000缓冲区溢出漏洞允许获取系统控制权
详细:
Microsoft SQL Server 2000有一个内置的散列函数,名为pwdencrypt()。
这个函数存在一个缓冲/堆栈溢出漏洞,允许攻击者发动拒绝服务攻击,使SQL Server崩溃,通过合适的方式构造shellcode,可能引起攻击者能以系统权限执行任何指令。
下面的例子通过超长字符串(353个字符A)将使SQL Server2000崩溃:
Select pwdencrypt(REPLICATE('A',353))
有的系统可能需要更长的字符串才能达到攻击效果,但1000个字符无论如何都足够让SQL Server崩溃了。
攻击方法:
下面的例子通过超长字符串(353个字符A)将使SQL Server2000崩溃:
Select pwdencrypt(REPLICATE('A',353))
有的系统可能需要更长的字符串才能达到攻击效果,但1000个字符无论如何都足够让SQL Server崩溃了。
尚未发现有效的,能导致非法获取系统控制权的shellcode代码出现。 参考技术B 可以弄个 MD5 加密的 写数据时进行加密 读取时在解密 参考技术C 楼上说MD5能解密 搞笑哦
Hibernate有几种查询方法
转录:从点到面,讲讲hibernate查询的6种方法。分别是HQL查询
,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询。
如果单纯的使用hibernate查询数据库只需要懂其中的一项就可以完成想要实现的一般功能,但是
从一个点,让我们掌握6中方法,则提供了更多选择。每一种方法都有其适用的情况与前提。
HQL查询
HQL是hibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点。示例代码:
static void query(String name)
Session s=null;
try
s=HibernateUtil.getSession();
//from后面是对象,不是表名
String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。
Query query=s.createQuery(hql);
query.setString("name", name);
List<Admin> list=query.list();
for(Admin admin:list)
System.out.println(admin.getAname());
finally
if(s!=null)
s.close();
适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。
对象化查询Criteria方法:
static void cri(String name,String password)
Session s=null;
try
s=HibernateUtil.getSession();
Criteria c=s.createCriteria(Admin.class);
c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
c.add(Restrictions.eq("apassword", password));
List<Admin> list=c.list();
for(Admin admin:list)
System.out.println(admin.getAname());
finally
if(s!=null)
s.close();
适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。
动态分离查询DetachedCriteria
static List dc(DetachedCriteria dc)
Session s = HibernateUtil.getSession();
Criteria c = dc.getExecutableCriteria(s);
List rs = c.list();
s.close();
return rs;
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
int id = 1;
if (id != 0)
dc.add(Restrictions.eq("id", id));
Date age = new Date();
if (age != null)
dc.add(Restrictions.le("birthday", age));
List users = dc(dc);
System.out.println("离线查询返回结果:" + users);
适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。 缺点:适用面较HQL有限。
例子查询
static List example(User user)
Session s = HibernateUtil.getSession();
List<User> users = s.createCriteria(User.class).add(
Example.create(user)).list();
// List<User>
// users2=s.createCriteria(User.class).add((Example.create(user)).ignoreCase())
// .createCriteria("child").add((Example.create(user))).list();
return users;
适用情况:面向对象操作。 缺点:适用面较HQL有限,不推荐。
sql查询
static List sql()
Session s = HibernateUtil.getSession();
Query q = s.createSQLQuery("select * from user").addEntity(User.class);
List<User> rs = q.list();
s.close();
return rs;
适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法 缺点:破坏跨平台,不易维护,不面向对象。
命名查询
static List namedQuery(int id)
Session s = HibernateUtil.getSession();
Query q = s.getNamedQuery("getUserById");
q.setInteger("id", id);
return q.list();
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.sy.vo.User" table="user" catalog="news">
</class>
<!-- 命名查询:定义查询条件 -->
<query name="getUserById">
<![CDATA[from User where id=:id]]>
</query>
<!-- 命名查询中使用sql,不推荐使用,影响跨数据库
<sql-query name="getUserById2">
<![CDATA[select * from User where ]]>
</sql-query> -->
</hibernate-mapping>
适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。 缺点:不面向对象。基于hql和sql,有一定缺陷。 参考技术A Hibernate有4种查询方法。
HQL 通过Hibernate提供的查询语言进行查询。Hibernate Query lanague
EJBQL(JPQL 1.0) 是EJB提供的查询语言
QBC(query by cretira)通过Cretira接口进行查询
QBE(query by Example) 通过Example编程接口进行查询
从功能强弱上排序:NativeSQL > HQL > EJBQL(JPQL 1.0) >QBC(query by cretira) >QBE(query by Example) 1: QBE (Query By Example) QBC查询方式。
QBC(Query By Criteria)查询方式是 Hibernate 提供的“ 更加面向对象”的一种检索方式。 QBC 在条件查询上比 HQL 查询更为灵活,而且支持运行时动态天生查询语句。
在Hibernate 应用中使用 QBC 查询通常经过 3 个步骤:
(1)使用 Session 实例的 createCriteria() 方法创建 Criteria 对象
(2)使用工具类 Restrictions 的相关方法为 Criteria 对象设置查询对象
(3)使用 Criteria 对象的 list() 方法执行查询,返回查询结果QBE查询QBE查询就是检索与指定样本对象具有相同属性值的对象。因此QBE 查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。 QBE 查询的功能子集,固然 QBE 没有 QBC 功能大,但是有些场合 QBE 使用起来更为方便。
工具类Example 为 Criteria 对象指定样本对象作为查询条件Java代码:
1 Session session = HibernateSessionFactory.getSessionFactory().openSe ssion();
2 Transaction ts = session.beginTransaction();
3 Customer c = new Customer();
4 c.setCname("Hibernate");
5 Criteria criteria = session.createCriteria(Customer. class );
6 Criteria.add(Example.create(c));
7 Iterator it = criteria.list().iterator();
8 ts.commit();
9 HibernateSessionFactory.closeSession(); 参考技术B 我只说 我常用的几种 Hibernate hql查询方法
Hibernate 在Spring管理下 可以用类继承了(extends) HibernateDaoSupport
然后 下面是一个我熟悉的写法:
public List<Prov> find(final String hql, final int currentPage, final int pageSize,
final String[] params)
return this.getHibernateTemplate().executeFind(new HibernateCallback()
@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException
Query query = session.createQuery(hql);
for(int i =0 ;i<params.length;i++)
query.setString(i, params[i]);
query.setFirstResult(PageUtil.startRec(currentPage, pageSize));
query.setMaxResults(pageSize);
return query.list();
);
调用和传递参数
String hql ="from Prov p where p.prov_id like ? and p.prov_name like ?";
String[] params ="%"+prov.getProv_id()+"%","%"+prov.getProv_name()+"%";
return super.find(hql,currentPage,pageSize,params);
分页查询 得到 各种条件下的省市
List<LinkUser> list = (List<LinkUser>) getHibernateTemplate().find(
"from LinkUser lu where lu.userNo = '" + no + "'");
等等。
如果只用 Hibernate 简单的 直接写
protected List<T> find(String hql, String... params)
Query query = session.createQuery(hql);
for (int i = 0; i < params.length; i++)
query.setString(i, params[i]);
return query.list();
或protected List<T> page(String hql,int currentPage,int pageSize, String... params)
Query query = session.createQuery(hql);
for (int i = 0; i < params.length; i++)
query.setString(i, params[i]);
query.setFirstResult(PageUtil.startRec(currentPage, pageSize));
return query.list();
除了以上还有criteria查询,本人没用过,网上还有许多,你自己可以搜搜,学习学习 参考技术C
HIbernate主要常用有三种查询方式HQL、QBC、SQL:
1).HQL(Hibernate Query Language):hibernate数据查询语言;
2).QBC(Query By Criteria):规则查询
3).SQL:原生的SQL语句(较为复杂的情况下使用)
想要详细了解的可以看一下下面的几篇文章:
QBC数据查询
HQL单表查询
HQL多表查询
希望对你有所帮助~
以上是关于sql数据加密有几种方法?的主要内容,如果未能解决你的问题,请参考以下文章