哈希加密
如果数据库保存了敏感的数据,如银行卡密码,客户信息等,你可能想将这些数据以加密的形式保存在数据库中。这样即使有人进入了你的数据库,并看到了这些数据,也很难获得其中的真实信息。
在应用程序的大量信息中,也许你只想交很小的一部分进行加密,如用户的密码等。这些密码不应该以明文的形式保存,它们应该以加密的形式保存在数据库中。一般情况下,大多数系统,这其中包括MySQL本身都是使用哈希算法对敏感数据进行加密的。
哈希加密是单向加密,也就是说,被加密的字符串是无法得到原字符串的。这种方法使用很有限,一般只使用在密码验证或其它需要验证的地方。在比较时并不是将加密字符串进行解密,而是将输入的字符串也使用同样的方法进行加密,再和数据库中的加密字符串进行比较。这样即使知道了算法并得到了加密字符串,也无法还原最初的字符串。银行卡密码就是采用的这种方式进行加密。
MySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA1和MD5。下面让我们试一试这4个函数,看看会得到什么结果。我们以加密字符串"pa55word"为例进行说明:
SELECT MD5('pa55word');
+----------------------------------+
| MD5('pa55word') |
+----------------------------------+
| a17a41337551d6542fd005e18b43afd4 |
+----------------------------------+
1 row in set (0.13 sec)
下面是PASSWORD函数
SELECT PASSWORD('pa55word');
+----------------------+
| PASSWORD('pa55word') |
+----------------------+
| 1d35c6556b8cab45 |
+----------------------+
1 row in set (0.00 sec)
下面是ENCRYPT函数
SELECT ENCRYPT('pa55word');
+---------------------+
| ENCRYPT('pa55word') |
+---------------------+
| up2Ecb0Hdj25A |
+---------------------+
1 row in set (0.17 sec)
上面的每个函数都返回了一个加密后的字符串。为了区分加密字符串的大小写,最好在使用ENCRYPT生成加密字符串时,将这个字段定义成CHAR BINARY类型。
上面列举了3种加密的方法,但我认为使用MD5加密是最好的。这是因为这样做可以将明文密码显示在处理列表中或是查询日志中,这样便于跟踪。如下面的INSERT语句使用插入了一条记录,其中的密码使用了MD5进行加密:
INSERT INTO table1 (user, pw) VALUE ('user1', MD5('password1') )
可以通过如下的语句进行密码验证:
SELECT * FROM table1 WHERE user = 'user1' AND pw = MD5('password1')
哈希加密方法可以很好地对密码进行加密,使用了这种方法加密,密码将无法 恢复成明文。
posted @
2008-06-10 09:42 念时 阅读(44) |
评论 (1) |
编辑
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>vForm表单验证程序</title>
<style type="text/css">
<!--
div.info {
width: 170px;
overflow:visible;
height:auto;
font-size: small;
position: absolute;
background-color: #FFffdd;
border: 1px solid #000;
filter:progid:DXImageTransform.Microsoft.Shadow(color=#111111,direction=135,strength=3);
top: 375px;
padding: 5px;
left: 671px;
}
div.info_title
.err{
padding: 5px;
height: 50px;
width: 24em;
position: absolute;
background-color: #FFFFCC;
left: 196px;
top: 114px;
font-size: small;
opacity:0.5;
border: 1px double #333333;
filter: Shadow(Color=#000000, Direction=135);
filter:progid:DXImageTransform.Microsoft.Shadow(color=#111111,direction=135,strength=5);
}
#form1 .text_input {
border-top: 1px solid #333333;
border-right: 1px solid #999999;
border-bottom: 1px solid #ddd;
border-left: 1px solid #000000;
}
.info_title {
color: #FF0000;
background: #ACB9D1;
}
#form1 {
position: static;
left: 581px;
top: 463px;
border: 1px solid #3300FF;
padding: 5px;
;
}
#imok {
display: block;
position: absolute;
height:315px;
overflow:scroll;
left: 100px;
top: 100px;
width: 306px;
}
.title h1 {
background: #33CCFF;
border-bottom: medium solid #3366FF;
}
.title p {
font-size: medium;
text-indent: 2em;
}
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: medium;
}
code {
font: 12px/18px "lucida Grande", verdana, lucida, Arial, helvetica, "宋体", sans-serif;
border:1px solid #0099cc;
padding:5px;
margin: 5px;
width: 80%;
color: #000;
background-color: #ddedfb;
display: block;
}
-->
</style>
<script language="JavaScript" type="text/javascript">
//程序基本思路:通过扩展对象来实现,将String扩展 将默认的表单元素扩展 定义两个自定义对象。
//String.isEmail
//String.isUrl
//表单元素.required
//表单元素.isvalid
//表单元素.validate
//
//字符串验证扩展
//├电子邮件验证
String.prototype.isEmail = function(){
var tmpStr = this;
var email = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
return email.test(tmpStr)
}
//├http地址验证
String.prototype.isUrl = function(){
var url = /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/;
var tmpStr = this;
return url.test(tmpStr);
}
//├日期验证(第一部分)
String.prototype.isDateTime = function(){
if(Date.parse(this)||Date.parseDate(this))
{
return true;
}
else
{
return false;
}
}
String.prototype.isInteger = function()
{
var _i = /^[-\+]?\d+$/;
var _s = this;
return _i.test(_s);
}
Date.prototype.toIsoDate = function()
{
var _d = this;
var _s;
_Y =_d.getFullYear();
_M = _d.getMonth() + 1;
_D = _d.getDate();
_H = _d.getHours();
_I = _d.getMinutes();
_S = _d.getSeconds();
with(_d)
{
_s = [getMonth() + 1,getDate(),getHours(),getMinutes(),getSeconds()];
}
for(var i = 0; i < _s.length; i++)
{
if (_s[i].toString().length == 1)_s[i]= '0'+_s[i];
}
return (_Y + '-'+_s[0]+'-'+_s[1]+' '+_s[2]+':'+_s[3]+':'+_s[4])
}
//├日期验证(第二部分)
Date.parseDate = function(str, fmt) {
fmt = fmt||"%Y-%m-%d %H:%M";
var today = new Date();
var y = 0;
var m = -1;
var d = 0;
var a = str.split(/\W+/);
var b = fmt.match(/%./g);
var i = 0, j = 0;
var hr = 0;
var min = 0;
for (i = 0; i < a.length; ++i) {
if (!a[i])
continue;
switch (b[i]) {
case "%d":
case "%e":
d = parseInt(a[i], 10);
break;
case "%m":
m = parseInt(a[i], 10) - 1;
break;
case "%Y":
case "%y":
y = parseInt(a[i], 10);
(y < 100) && (y += (y > 29) ? 1900 : 2000);
break;
case "%b":
case "%B":
for (j = 0; j < 12; ++j) {
if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
}
break;
case "%H":
case "%I":
case "%k":
case "%l":
hr = parseInt(a[i], 10);
break;
case "%P":
case "%p":
if (/pm/i.test(a[i]) && hr < 12)
hr += 12;
else if (/am/i.test(a[i]) && hr >= 12)
hr -= 12;
break;
case "%M":
min = parseInt(a[i], 10);
break;
}
}
if (isNaN(y)) y = today.getFullYear();
if (isNaN(m)) m = today.getMonth();
if (isNaN(d)) d = today.getDate();
if (isNaN(hr)) hr = today.getHours();
if (isNaN(min)) min = today.getMinutes();
if (y != 0 && m != -1 && d != 0)
return new Date(y, m, d, hr, min, 0);
y = 0; m = -1; d = 0;
for (i = 0; i < a.length; ++i) {
if (a[i].search(/[a-zA-Z]+/) != -1) {
var t = -1;
for (j = 0; j < 12; ++j) {
if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
}
if (t != -1) {
if (m != -1) {
d = m+1;
}
m = t;
}
} else if (parseInt(a[i], 10) <= 12 && m == -1) {
m = a[i]-1;
} else if (parseInt(a[i], 10) > 31 && y == 0) {
y = parseInt(a[i], 10);
(y < 100) && (y += (y > 29) ? 1900 : 2000);
} else if (d == 0) {
d = a[i];
}
}
if (y == 0)
y = today.getFullYear();
if (m != -1 && d != 0)
return new Date(y, m, d, hr, min, 0);
return today;
};
//扩展完成
//对象定义
var vform = new Object;
//获取弹出提示的显示位置
vform.getAbsolutePos = function(el) {
var _p = { x: 0, y: 0 };
do{
_p.x += (el.offsetLeft - el.scrollLeft);
_p.y += (el.offsetTop - el.scrollTop);
}
while(el=el.offsetParent)
return _p;
};
vform.toString = function()
{
return("vForm表单验证程序\n版本:1.0beta\n作者:雷晓宝\n时间:2006-07-31\n网址:http://lxbzj.com\n许可:LGPL");
}
vform.rules = new Array;
vform.rules.add = function(obj,minLength,dataType,errmsg,maxLength,rule,patams)
{
var curlen = this.length;
this[curlen] = [obj,minLength,dataType,errmsg,maxLength,rule,patams];
//this[curlen] = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ];
return this.length;
}
vform.init= function()
{
if(document.getElementById(this.form_id))
{
//获取表单
var o = document.getElementById(this.form_id);
//遍历规则
for(var i = 0 ;i< this.rules.length;i++)
{
_r = this.rules[i]
//如果存在元素,则添加验证程序
if(_o = o.elements[_r[0]])
{
//判断是是否必填,是否有最小长度
if(_r[1] > 0 )
{
_o.required = true;//必填的含义和最小长度为1是一样的
_o.minLength = parseInt(_r[1]);
}
else
{
_o.required = false;
_o.minLength = 0;
}
//判断是否有最大长度;
if(_r[4])
{
_o.maxLength = parseInt(_r[4]);
}
//添加长度验证函数
_o.validLength = function ()
{
var b =true;
if(this.minLength)
{
b = (this.minLength <= this.value.length);
}
if(this.type == 'textarea' && this.maxLength )
{
b = b && (this.maxLength >= this.value.length );
}
return (b);
}
//添加验证,进行格式验证
switch(_r[2])
{
case 'e-mail':
_o.validate = function()
{
this.isvalid = this.validLength() && this.value.isEmail();
return (this.isvalid);
};
break;
case 'url':
_o.validate = function()
{
if (this.value.substring(0,7) != 'http://')this.value = 'http://' +this.value;
this.isvalid = this.validLength() && this.value.isUrl();
return (this.isvalid);
}
break;
case 'date':
_o.validate = function()
{
var _d = Date.parse(this.value)||Date.parseDate(this.value);
this.value = _d.toIsoDate();
this.isvalid = this.validLength() && this.value.isDateTime();
return (this.isvalid);
a=a>b?1:1;
}
break;
case 'number':
_o.validate = function()
{
this.isvalid = this.validLength() && this.value.isInteger();
return (this.isvalid);
}
break;
case 'any':
_o.validate = function()
{
this.isvalid = this.validLength();
return this.isvalid
}
break;
default :
var regexp = /^\\\w+$/;
if ( regexp.test(_r[2]))//表示必须和同表单下的某个字段的值一样。用于重复输入的验证
{
_el = _r[2].substring(1);
if (o.elements[_el]){
_o.equal = _el;
_o.validate = function()
{
if(_o = this.form.elements[this.equal])
{
if ( (_o.value == this.value) && this.validLength())
{
return true;
}else {
return false;
}
}else{
alert('setup error');
}
}
}else
{
alert(_el + 'is not a valid form element');
_o.validate = function(){return true;}
}
}
var regexp1 = /^\\(==|!=|>=|<=|>|<)/;
if ( regexp1.test(_r[2]) )
{
_s0 = _r[2];
_s1 = RegExp.$1;
_s2 = _s0.replace(regexp1,'');
_operator = _s1.substring(0);//比较操作符
var regexp2 = /^\w+$/;
if (regexp2.test(_s2))//是一个标志符,整数 或者变量
{
_o.operation = _operator+_s2;
_o.validate = function()
{
_b = true;
if (this.value.length !=0)
{
_b = eval(this.value+this.operation+';');
}
_b = _b && this.validLength();
return _b;
}
}
};
break;
}
//添加验证提示(div标签)并初始化
var _p = vform.getAbsolutePos(_o);
_o.tip = new tip(_r[3],vform.err_class,_p.x+_o.offsetWidth+3,_p.y);
_o.tip.init();
//失去焦点时,开始验证
_o.onblur =function(e)
{
if(this.minLength || this.value.length >0)
{
if( this.validate() )
{
this.tip.hide();
}else
{
this.tip.show();//显示错误信息
//this.focus(); 添加这句在ie里会导致死循环 :(
return false;
}
}
}
}
}
//焦点验证可能会失败,所以最后需要表单提交前的验证作为最后的补充。
document.getElementById(this.form_id).onsubmit = function()
{
var valid = true;
for(i=0;i<this.elements.length;i++)
{
_o = this.elements[i];
if(_o.minLength && !_o.isvalid)
{
_o.tip.show();
valid = false;
}
}
return valid;
}
}
}
//弹出提示定义
function tip(text,className,x,y)
{
var o = document.createElement("div");
o.style.display = "none";
o.innerHTML = text;
//var t = document.createTextNode(text);
document.body.appendChild(o);
//o.appendChild(t);
this.init = function(dis)
{
o.className = "info";
o.style.left = x+"px";
o.style.top = y+"px";
o.style.zindex = 100;
if(dis)
{
o.style.display = "";
}
else
{
o.style.display = "none";
}
}
this.show = function()
{
o.style.display = "";
}
this.hide = function()
{
o.style.display = "none";
}
}
function start()
{
vform.form_id = 'form1';//必须是表单的id
vform.err_class = 'info';//出错提示的样式
//验证规则,逐条填写
vform.rules.add('frm_name',1,'e-mail','请您按照 [email]user@domain.com[/email] 的格式输入电子邮件地址。
<span style="color:#f00">必填项目</span>');
vform.rules.add('myweb',1,'url','请您按照 http://www.domain.com 的格式输入您的网址。
<span style="color:#f00">必填项目</span>');
vform.rules.add('dateinput',0,'date','请按2000-03-05 的格式输入日期。
<span style="color:#f00">必填项目</span>');
vform.rules.add('qq',0,'number','这必须是一个整数');
vform.rules.add('least10',10,'any','您必须至少填写10个
<span style="color:#f00">必填项目</span>');
vform.rules.add('ok100',1,'any','这里被限制为100个字符
<span style="color:#f00">必填项目</span>',100);
vform.rules.add('r_pass0',5,'any','密码最短5位最长20位
<span style="color:#f00">必填项目</span>',20);
vform.rules.add('r_pass1',5,"\\r_pass0",'确认密码错误
<span style="color:#f00">必填项目</span>',20);
vform.rules.add('frm_sel',1,"\\>2",'必须大于2000
<span style="color:#f00">必填项目</span>');
vform.init();
}
</script>
</head>
<body onload="start()">
<form id="form1" name="form1" method="get" action="">
<label for="frm_name">e-mail:
<input name="frm_name" type="text" class="text_input" id="frm_name" title="输入一个电子邮箱地址"/>
</label>
*
<p>
<label for="r_pass0">输入密码:
<input name="r_pass0" type="text" class="text_input" id="r_pass0" title="输入您希望的密码 " />
</label>
*</p>
<p>
<label for="r_pass1">密码确认:
<input name="r_pass1" type="text" class="text_input" id="r_pass1" title="将密码确认一次" />
</label>
*</p>
<p>
<label for="frm_sel">选择:
<select name="frm_sel" id="frm_sel" title="请选择一个答案">
<option value="0">请选择一个答案</option>
<option value="1" selected="selected">1000</option>
<option value="2">2000</option>
<option value="3">3000</option>
<option value="4">4000</option>
<option value="5">5000</option>
<option value="6">6000</option>
</select>
</label>
*</p>
<p>
<label for="input3">输入网址:
<input name="myweb" type="text" class="text_input" id="input3" title="输入一个网址" onmousemove="" value="http://" maxlength="100"/>
</label>
*</p>
<p>
<label for="dateinput">输入日期
<input name="dateinput" type="text" class="text_input" title="输入一个日期" id="dateinput"/>
</label>
*</p>
<p>
<label for="mub">输入数字
<input name="qq" type="text" class="text_input" title="填写数字" id="mub"/>
</label>
</p>
<p>
<label for="len">输入任意但长度限制为10个
<input name="least10" type="text" class="text_input" maxlength="88" id="len"/>
*
</label>
</p>
<p>
<label for="text">只能输入100个
<textarea name="ok100" cols="40" rows="5" id="text" title="详细内容"></textarea>
*
</label>
</p>
<p>
<input type="submit" name="Submit" value="提交" />
<button onclick="alert(vform)" >关于验证程序</button>
</p>
</form>
<!--具体的日期设置,必须放在body的结束标签前面-->
<script type="text/javascript">
vform .init();
Calendar.setup({
inputField : "dateinput", // 把这个改成你需要的 id
ifFormat : "%Y-%m-%d %H:%M", // format of the input field
showsTime : true,
//button : "dateinput_btn",
timeFormat : "24"
});
</script>
<!--END具体的日期设置,必须放在body的结束标签前面-->
<div class="title">
<h1>vForm1.0beta</h1>
<ul>
<li>作者:雷晓宝</li>
<li>时间:2006-08-08</li>
<li>网址:http://lxbzj.com</li>
<li>e-mail:lxbzmy@163.com</li>
<li>许可:LGPL</li>
</ul>
<h2>功能简述:</h2>
<ol>
<li>
<h3>验证:</h3>
<ul>
<li>http地址。</li>
<li>时间日期</li>
<li>e-mail</li>
<li>数字</li>
<li>字符长度检查</li>
<li>一项输入与另一项输入比较(例如:密码的确认输入)</li>
<li>大小比较(只能有一个比较符号)</li>
</ul>
</li>
<li>
<h3>特点</h3>
<ul>
<li>扩展容易,可以方便的添加自己需要的验证方式</li>
<li>兼容性好(ie5,6 firefox,oprea)。</li>
<li>可用性好,没有使用alert()来弹出提示;</li>
</ul>
</li>
</ol>
<p> </p>
<h2>使用方法</h2>
<p>使用时,需要定义一个出错提示框的样式,本例的样式为:<code>div.info {
width: 170px;
overflow:visible;
height:auto;
font-size: small;
position: absolute;
background-color: #FFffdd;
border: 1px solid #000;
filter:progid:DXImageTransform.Microsoft.Shadow(color=#111111,direction=135,strength=3);
padding: 5px;
}</code></p>
<p>然后在网页<head>部分中添加<code><script type="text/javascript" src="calendar/calendar.js"></script></code>
,然后可以写一个函数设置表单名称,验证规则,<code>function start()
{
vFormvform.form_id = 'form1';
vform.err_class = 'info';
// (obj,required(true/false),dataType,errmsg,minlen,maxlen,rule,patams)
//验证规则,逐条填写
vform.rules.add('frm_name',1,'e-mail','请您按照 [email]user@domain.com[/email] 的格式输入电子邮件地址。<br /><span style="color:#f00">必填项目</span>');
vform.rules.add('myweb',1,'url','请您按照 http://www.domain.com 的格式输入您的网址。<br /><span style="color:#f00">必填项目</span>');
vform.rules.add('dateinput',0,'date','请按2000-03-05 的格式输入日期。<br /><span style="color:#f00">必填项目</span>');
vform.rules.add('qq',0,'number','这必须是一个整数');
vform.rules.add('least10',10,'any','您必须至少填写10个<br /><span style="color:#f00">必填项目</span>');
vform.rules.add('ok100',1,'any','这里被限制为100个字符<br /><span style="color:#f00">必填项目</span>',100);
vform.init();
}</code>最后为body添加onload事件。 <code> <body onload="start();">
</code></p>
<p> </p>
</div>
</body>
</html>
posted @
2008-06-05 11:20 念时 阅读(96) |
评论 (0) |
编辑
//在浏览器状态栏里显示。
<html>
<head>
<script Language="JavaScript">
var msg="这是一个跑马灯效果的JavaScript文档";
var interval = 100;
var spacelen = 120;
var space10=" ";
var seq=0;
function Scroll() {
len = msg.length;
window.status = msg.substring(0, seq+1);
seq++;
if ( seq >= len ) {
seq = spacelen;
window.setTimeout("Scroll2();", interval );
}
else
window.setTimeout("Scroll();", interval );
}
function Scroll2() {
var out="";
for (i=1; i<=spacelen/space10.length; i++) out +=
space10;
out = out + msg;
len=out.length;
window.status=out.substring(seq, len);
seq++;
if ( seq >= len ) { seq = 0; };
window.setTimeout("Scroll2();", interval );
}
Scroll();
</script>
<body>
</body>
</html>
posted @
2008-06-05 10:25 念时 阅读(72) |
评论 (1) |
编辑
今天跟某个国内开源软件作者聊天,他抱怨:“在中国,程序员都希望用免费的,而且你即使免费,不是大厂,还不敢用,所以他还要你开源,有了源码吧,他还不去研究,希望扩充功能还想原作者去扩充。所以,就程序员这一点,也注定了程序员自己很苦很穷”。
这就让我想起了软件的价值这个话题。
一百年前,马克思就说过,商品就是用于交换的凝结着人类智慧和体力的劳动成果。并讨论过商品的价格和价值的关系。价值是相对稳定的,价格是围绕着价值来回波动,但从长期看,价格反映价值。但马克思限于当时的科技水平,想必没有考虑过计算机软件这种商品的问题吧。
首先计算机软件是商品,它是作者绞尽脑汁作出来的用来卖钱的劳动成果,只是里面主要凝结着人类智慧,没有多少体力,但确实是劳动成果。这个劳动成果用于交换,而且在比较成熟的市场经济环境下,那它就能卖出应用的价钱。但是软件这个商品同传统商品相比有三大特点,1。可低成本大规模复制,2。它不是实体,3,软件消耗自然资源少,它大部分只是人力成本。它只是一种信息。这很容易导致盗版和人民对软件价值的认识不足。
盗版的罪恶罄竹难书,它严重破坏市场经济体制,浪费了大量的社会资源,盗版养活了几个困难人士,成就了少数富翁,但浪费了数以亿计的投资,成千上万的高级人力资源辛苦工作的结果被人毫不尊重的非常浪费的利用,这是何等的不公。
盗版分为个人盗版和商业盗版,个人盗版原因可能是没钱卖正版或只是暂时学习研究用,并不用它来赚钱,这是有一些理由的,但毕竟盗版是不尊重软件作者的行为,应当减少。而商业盗版则是使用盗版来赚钱,情节恶劣,动机不好,应当受到严厉打击。目前国内的盗版率我猜测有90%以上,根据我国的国情,个人盗版率应当控制在60%以下,商业盗版率应越低越好。
以前看到一个做加密光盘的广告“世界上本来没有救世主,软件加密靠自己”,其实我一直认为,对付盗版有且只有一个救世主,那就是阿政,可惜阿政对盗版整治不力,让我非常失望。最近国家搞打击盗版百日行动,但几天前路过珠江路,还是发现路边不少兜售盗版光盘的人。我一直搞不清楚,盗版对提高GDP有什么好处,为何阿政不大管?
前几天中国要求欧盟承认中国是完整的市场经济,欧盟没答应,想必诸位心中对此也没什么底气吧。就对软件市场,只要有严重的盗版,完整成熟的软件市场体制就不可能实现。虽然国家对软件行业现在比较扶持,不断的输血,但是这边输血,盗版在那边吸血,这让我想起小学一个数学题目,一个水池,一边注水,一边放水,多久注满?这种可笑的现象却在神州大地上多处演绎,这种日子何时是个头啊。
长期严重盗版导致一些人对软件的价值认识不足,认为所有的软件,无论大小,都应当是一张盗版光盘的钱,目前是4块钱,现在存在很多盗版破解软件站点,那软件的价格也就是很低廉的上网费了。长此以往,软件真的就是很软弱很渺小了。
其实每个软件都凝集这作者很多的智慧,而且很多软件能帮助使用者简单的处理很复杂的问题,对客户带来的价值都不低。现在软件让人类以神仙般的速度处理海量信息,就像飞机让人类以神仙般的速度旅行一样,都对客户带来很大的价值,但凭什么飞机贵而软件贱。
其实软件的遭遇就代表了知识产权的遭遇,知识产权作品是不同于其他产品,它无形无色,看不见摸不着,因此不了解它的人是不明白它的价值的。而一般的人对于不了解的事物就认为是没有价值的。随着人们的知识水平的提高,人们就对知识产权日益了解,人们也就更容易明白知识产权的价值,也就更容易认同知识产权的价值。
目前,领导和掌握这个社会的主要是我们的父母辈,也就是上世纪五六七十年代出生的人,这辈人有一个共同的特点就是年轻的时候经历了文化大革命,本该好好学习天天向上,但历史却让他们去闹无意义的革命,造成他们没有经过应有的教育,知识水平不高,因此对知识产权了解不够,也就谈不上认同软件的价值了。这辈人思想水平已经定型了,已经无法大面积的改变。
我们这辈人经过比上辈人好的多的教育,知识水平相对比较高,对知识产权有所了解,因此有认同软件的价值的基础和能力。相信过十年二十年后成为社会的主宰后,到时很有可能能建立合理的软件价值观念,到时候才能建立完整成熟的市场经济体制。
但是我们不必等十年二十年,我们现在就可以为此工作。
首先我们这些计算机软件开发人员自身是开发软件的,有相对突出的知识水平,对知识产权比较了解,因此首先是自己认同软件的价值,再也不能认为软件就值4块钱。你尊重别人的软件,别人也尊重自己的软件,大家相互尊重,共同维护软件的价值,大家都是编程的,都知道一行行代码,一个个文档都是凝集着人类的智慧和创造力,都是辛勤的劳动成果。理应受到尊重。中国的软件业也不小,开发人员也不少,都是优质青年,团结起来还是很有力量的。大家记住,尊重别人就是尊重自己。
广大软件破解者们,请手下留情,你们破解别人的吐血之作,让别人毫无收益,你们赚了1元钱,但浪费了这个行业的几百几千元的投入,这严重打击创新型社会的建立过程。大家都是软件行业人士,你们在船底凿洞喝水,等船沉了,大家都完蛋。
大家自己尊重认同软件的价值,也应当向周围人推销软件价值的观念。这不但能给行外人士树立一个高手形象,而且有利于增加软件行业的整体收益,最终是大家都获益。
最后小弟带头赤身裸体冰天雪地珠穆朗玛峰顶二指禅跪求阿政大力保护知识产权,保护创新,建立真正全面的市场经济体制和创新型社会。
posted @
2008-06-04 17:37 念时 阅读(23) |
评论 (0) |
编辑