2/28/2010 Invite you to the Grove Community Church this Sunday邀请您本周日去果园社区英文教会
2/28/2010 Invite you to the Grove Community Church this Sunday邀请您本周日去果园社区英文教会
Hi all,
You are invited to the Grove Church on 2/28/2010 Sunday. This Sunday is Chinese Lantern Festival, Jan 15 of Chinese Lunar Calendar. We will celebrate it by making Yuanxiao (rice glue ball, sweet dumpling) together at lunch after the church service, before the afternoon talk. Your family and friends are also welcomed to invite.
Pastor Tom and Carol are moving into their new house this week.This weekend Pastor Joe Hobbs will be bringing God’s Word to The Grove. He is going to tackle Genesis chapters 13-17. The message is titled, "Abraham: Bringing Hope…Changing Lives." In addition to reading the chapters in Genesis, take a look at Romans 4:18-21 before you come this weekend as the writer reflects on the life of Abraham. Remember the phrase, "In hope against hope he believed…" Come prepared as Joe will encourage you to have hope in the midst of difficult times. Joe is looking forward to the challenge of bringing this weekend’s message to all of us.
This time 4 stops around us are listed below and you can select the nearest one to you. (If you are too far away from the stops, we will take you separately. Please tell me your name, address and phone number by replying this email.)
The map is here( also attached) : http://photo.godwithus.cc/v/godwithus_map.jpg.html or http://godwithus.cn/map/
They are (manuscript proposed):
1) Windwood(Linden&Rustin)
1128 W Linden St, Riverside, CA 92507
2) Korean Church(Blaine&Canyon-Crest)
891 W Blaine St, Riverside, CA 92507
3) W Big Springs&Watkins Bus Stop
186 W Big Springs Rd, Riverside, CA
4) UCR Extension Center
1242 University Ave, Riverside, CA 92507
Please tell me which stop you will wait for the pickup when you reply the email.The time to pick up will be around 9:45am to 10:00am.If you will go the the Grove Community Church this Sunday, please EMAIL back before 7pm of Feb 20Saturday. Please REPLY this email or send an email to "godwithus@godwithus.cc" telling us that you plan to come. I appreciate you very much for your consideration.
Thanks and Sorry to bother you.
best wishes
Michael
大家好,
邀请您来参加这个周日(2月28日,农历正月十五元宵节)早晨的果园社区教会的主日崇拜。这个主日是中国的正月十五元宵节,我们将在教会聚会后和团契交谈之前来做元宵以庆祝这个节日。
本周牧师Tom和Carol将乔迁新家。本周Joe Hobbs牧师来给果园教会传讲神的道。他将要讲到《创世记》13-17章。信息的主题是“亚伯拉罕:带来希望,改变生命”。希望您在来教会之前,在读《创世记》这些章节的同时,请查看罗马书4章18-21节看看作者是如何来回顾亚伯拉罕的。请记下这节经文,罗 4:18, Who in hope believed against hope[ASV],在无可指望的时候,因信仍有指望[CUV]。准备好来聚会,Joe会鼓励你在艰难困苦的岁月当中,如何拥有希望。Joe期待着讲本周的这个信息带给我们所有人。
罗马书Romans 4:18-21 (CUV, NIV):
18
他在无可指望的时候,因信仍有指望,就得以作多国的父,正如先前所说,你的后裔将要如此。
Against all hope, Abraham in hope believed and so became the father of many nations, just as it had been said to him, "So shall your offspring be."
19
他将近百岁的时候,虽然想到自己的身体如同已死,撒拉的生育已经断绝,他的信心还是不软弱。
Without weakening in his faith, he faced the fact that his body was as good as dead–since he was about a hundred years old–and that Sarah’s womb was also dead.
20
并且仰望神的应许,总没有因不信,心里起疑惑。反倒因信,心里得坚固,将荣耀归给神。
Yet he did not waver through unbelief regarding the promise of God, but was strengthened in his faith and gave glory to God,
21
且满心相信,神所应许的必能作成。
being fully persuaded that God had power to do what he had promised.
这次草拟的4个站点如下(如果你太远,我们会单独接送,回信时请告知你的姓名、地址和电话):
地图在这里(或见附件):http://photo.godwithus.cc/v/godwithus_map.jpg.html 或者 http://godwithus.cn/map/
1) Windwood(Linden&Rustin)
1128 W Linden St, Riverside, CA 92507
2) Korean Church(Blaine&Canyon-Crest)
891 W Blaine St, Riverside, CA 92507
3) W Big Springs&Watkins Bus Stop
186 W Big Springs Rd, Riverside, CA
4) UCR Extension Center
1242 University Ave, Riverside, CA 92507
在回复时请指定您准备候车的站点,若单独接送,请告知你的姓名、
地址和电话。接送时间为上午9:45到10:00左右。如果特殊情况会电话联系。如果您这周日要去果园教会,请在2月27号下午7点之前回信,邮件选项选择“回复”即可。请“回复”邮件,或者给godwithus@godwithus.cc发送一封邮件告诉我们您计划来参与。我们非常感谢您的体贴。
明旭
–
She will give birth to a son, and you are to give him the name Jesus, because he will save his people from their sins. All this took place to fulfill what the Lord had said through the prophet: ‘The virgin will be with child and will give birth to a son, and they will call him Immanuel’ –which means, ‘God with us.’ (Matthew 1:21-23)
Links: http://godwithus.cc http://godwithus.cn
转载:通过 Firefox 扩展为 Google Calendar 加密
通过 Firefox 扩展为 Google Calendar 加密
在 Google Calendar 中存储表示事件名称和描述的加密数据
![]()
![]()
![]()
文档选项
![]()
未显示需要 JavaScript 的文档选项
![]()
![]()
![]()
![]()
级别: 初级
Nathan Harrington, I/T 专家, IBM
2008 年 8 月 04 日
当今的 Web 应用程序为在线存储、访问和协作提供了许多便利。虽然一些应用程序为用户数据提供了加密,但为数不多。本文提供了添加基本加密支持所需的工具和代码,使您可以在一个最流行的在线日程表上加密用户数据。通过运用 Firefox 扩展和 Gnu Privacy Guard 的巨大灵活性,本文展示如何将加密的事件描述存储到 Google Calendar 应用程序,并且只向拥有解密密匙的用户显示纯文本。
本文从 Elias Torres 的出色的 “Google Calendar Quick Add” 扩展开始,逐步向您介绍如何提取、更改和插入各种组件,为事件进行加密,而不仅仅是使用加密的 TLS 数据通道。按照本文的说明进行操作之后,将会得到下面 图 1 所示的示例,在这里,服务器操作人员看到的是左边的内容,而 Web 浏览者看到的是右边的内容。
任何能够提供 2002 年以后的浏览体验的硬件设备,应该能够运行本文所使用的代码。加密算法属于处理器密集型作业,因此,如果要在一个页面上对十几个,甚至上百个日程表事件进行加密,更快的硬件支持能够提供更好的浏览体验。
需要 Firefox 1.5(或更新的版本)和 GnuPG(Gnu Privacy Guard)。具备各种 Firefox 扩展开发工具也是个不错的主意。查看下面的 参考资料 小节获得这些软件包的链接。
虽然本文的开发基于 Ubuntu 7.10 系统,但所用到的概念适用于各种操作环境。着手开发之前,确保您的系统支持 Perl、GnuPG 和 Firefox。
![]()
![]()
本文要求您基本熟悉 Firefox 扩展的开发过程。本文不需要特定的编译器和环境配置,但您必须熟悉软件开发,因为可能需要诊断与设置有关的问题或配置错误。
出于开发的需要,建议创建一个新的 Firefox 配置文件。下面的 参考资料 小节提供了如何创建新的配置文件的信息,同时也提供了有用的关于扩展开发站点的链接。
![]()
跨平台兼容性
本文的开发基于 Ubuntu 7.10 Linux® 发行版。如果要严格地遵循本文的说明进行操作,必须使用较新的 Linux 发行版。不过这里提到的所有软件(Firefox、GnuPG 和 Perl)都有对应的 Microsoft® Windows® 版本。只要稍微修改路径名和外部程序,这里所用的代码将可以在其他各种平台上使用。
GnuPG 将用于处理这个扩展的所有加密函数。这个方法提高了 JavaScript 的算法实现效率,同时也提供了健壮的跨平台密匙管理。您需要一个功能齐全的 GnuPG 安装,并且能够访问您选择的加密密匙。此外,还需要 gpg-agent 程序(通常是 GnuPG 包的一部分),用于处理已记住的 passphrase 的临时存储和过期。
有了处理加密的函数性扩展开发环境和 GnuPG 之后,可以通过更改前面开发的扩展的一些代码来修改接口。Elias Torres 开发的 Google Quick Add 扩展为插入加密修改提供了一个很好的开端。在加密阶段,当前输入的事件文本将存储在磁盘上,然后一个外部程序对它进行加密,加密后的文件将被读入并发送到 Google 服务器。在解密阶段,每个事件都被写到磁盘上,然后进行解密,最后读回纯文本并显示给用户。另一种代替方法涉及到编写新的协议,该协议由 Firefox 程序管理。尽管这个过程能够提供更加健壮的数据管道,输出、处理和读取则是更加简单的进程间通信方法,适合于这类扩展。
在继续使用本文提供的代码之前,确保您设置了函数性 Firefox GnuPG 和 gpg-agent。
![]()
![]()
构建 Google Calendar Quick Add 扩展
Google Calendar Quick Add 扩展利用 Google Calendar SOAP API 从任意页面上获得事件并添加日程表中。本文通过负载截取和过程加密的方式向日程表添加加密事件。一个代替方法是简单地向 Google Calendar 添加经 ASCII 封装的条目,但这里讨论的方法将自动完成这个过程。
首先,创建一个保存扩展目录和代码的目录,比如 mkdir ~/calendar。转到这个目录,然后从 参考资料 小节中指定的链接将 Quick Google Calendar Quick Add 扩展 xpi 下载到这个目录。
Encrypt
用以下命令解压缩 xpi:unzip quickgooglecal.xpi。转到刚才创建的 chrome 目录,然后运行命令 unzip quickgooglecal.jar。现在您会看到一个目录树,类似于 清单 1:
清单 1. Google Calendar Quick Add 目录结构
calendarEncrypt/chrome.manifest calendarEncrypt/readme.txt calendarEncrypt/chrome calendarEncrypt/chrome/content calendarEncrypt/chrome/content/hello.xul calendarEncrypt/chrome/content/overlay.xul calendarEncrypt/chrome/content/overlay.js calendarEncrypt/chrome/skin calendarEncrypt/chrome/skin/overlay.css calendarEncrypt/chrome/quickgooglecal.jar calendarEncrypt/chrome/locale calendarEncrypt/chrome/locale/en-US calendarEncrypt/chrome/locale/en-US/hello.dtd calendarEncrypt/chrome/locale/en-US/overlay.dtd calendarEncrypt/install.rdf calendarEncrypt/quickgooglecal.xpi
转到 ~/calendarEncrypt 目录并编辑 install.rdf 文件。更改标识符和创建者,如 清单 2 所示:
Change the identifier:
<em:id>{E31AE5B1-3E5B-4927-9B48-76C0A701F105}</em:id>
to:
<em:id>calendarEncrypt@devWorks_IBM.com</em:id>
Also, change the creator:
<em:creator>Elias Torres</em:creator>
to:
<em:creator>Elias Torres with modifications from devWorks</em:creator>
编辑 chrome.manifest 文件,将基于 jar 的扩展打包方式更改为更适合开发人员的目录结构打包方式。清单 3 给出了必要的更改。
清单 3. 将 chrome.manifest jar 更改为目录结构
Original chrome.manifest content quickgooglecal jar:chrome/quickgooglecal.jar!/content/ overlay chrome://browser/content/browser.xul chrome://quickgooglecal/content/overlay.xul locale quickgooglecal en-US jar:chrome/quickgooglecal.jar!/locale/en-US/ skin quickgooglecal classic/1.0 jar:chrome/quickgooglecal.jar!/skin/ style chrome://global/content/customizeToolbar.xul chrome://quickgooglecal/skin/overlay.css Change to directory based chrome.manifest: content quickgooglecal chrome/content/ overlay chrome://browser/content/browser.xul chrome://quickgooglecal/content/overlay.xul locale quickgooglecal en-US chrome/locale/en-US/ skin quickgooglecal classic/1.0 chrome/skin/ style chrome://global/content/customizeToolbar.xul chrome://quickgooglecal/skin/overlay.css
现在,在 Firefox 开发配置文件中为当前的扩展目录设置一个链接。例如,如果您的配置文件是 ~/.mozilla/firefox/b2w2sglj.development,就在 ~/.mozilla/firefox/b2w2sglj.development/extensions/ 创建一个称为 calendarEncrypt@devWorks_IBM.com 的链接。将当前的 Google Quick Add 开发目录路径放置到 calendarEncrypt@devWorks_IBM.com 文件中,在这个示例中是:/home/username/calendarEncrypt。
登录 Google Calendar 然后按 ctrl+;激活 Google Calendar Quick Add 扩展。通过输入 Test unencrypted event tomorrow 15:30 验证可以正确添加事件。验证事件可以正确地显示在日程表上。
Google Calendar Quick Add 扩展就绪之后,现在就可以向扩展插入支持加密和解密的修改了。
![]()
![]()
![]()
![]()
本文通过拦截和加密 Quick Add Event 负载的方式,帮助实现自动向日程表添加加密事件。修改现有的扩展使其支持拦截,见下面的 清单 4。编辑 chrome/content/hello.xul 文件并删除第 69 行:var quickAddText = number_html(document.getElementById("quickText").value);。将下面的代码插入到第 69 行:
var words = document.getElementById("quickText").value.split(' ');
var dayVal = words[words.length-2];
var timeVal = words[words.length-1];
var elementData = "";
for( var n=0; n < words.length-2; n++ ){
elementData = elementData + " " + words[n];
}
以上的代码假设日期和时间通常是快速事件文本中的最后两个单词。为了确保能够在日程表中准确放置,所有后来快速添加的事件的格式必须是 “消息 文本 日期 时间”,日期的格式为 “friday/monday/tomorrow/etc”,时间的格式为 “05:30/10:30/etc”。
将事件描述文本从事件日期和时间分离出来后,接下来应该将事件文本写到磁盘,然后对它进行加密。添加 清单 5 中第 77 行的代码:
// Write the quick event text to disk
var fileOut = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
fileOut.initWithPath("/tmp/calendarEvent");
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
.createInstance(Components.interfaces.nsIFileOutputStream);
foStream.init(fileOut, 0x02 | 0x08 | 0x20, 0666, 0);
foStream.write(elementData, elementData.length);
foStream.close();
// Run the external encryption process
var fileExe = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
fileExe.initWithPath("/tmp/CalendarCrypt.pl");
var process = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess);
process.init(fileExe);
var args = ["encrypt"];
process.run(true, args, args.length);
清单 5 的第一部分将配置文件 "/tmp/calendarEvent",将拦截到的事件文本写到磁盘。这个文件包含纯文本数据,但这些数据将在加密完成后被分解并删除。清单 5 的第二部分配置了一个文件,使它能够通过推荐的 nsIProcess 组件执行。/tmp/CalendarCrypt.pl 是一个 Perl 程序(将在后面介绍),它处理加密、解密和安全删除函数。对数据进行加密之后,清单 6 中的代码读回加密后的事件文本。将下面的代码置于 chrome/content/hello.xul 的第 98 行。
// Read the encrypted text back in
var fileIn = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
fileIn.initWithPath("/tmp/calendarEvent.asc");
var istream = Components.classes["@mozilla.org/network/file-input-stream;1"]
.createInstance(Components.interfaces.nsIFileInputStream);
istream.init(fileIn, 0x01, 0444, 0);
istream.QueryInterface(Components.interfaces.nsILineInputStream);
var data = "";
var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"]
.createInstance(Components.interfaces.nsIFileInputStream);
var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"]
.createInstance(Components.\
interfaces.nsIScriptableInputStream);
// above line split on \ for formatting, do not include the line break
fstream.init(fileIn, -1, 0, 0);
sstream.init(fstream);
var str = sstream.read(4096);
while (str.length > 0) {
data += str;
str = sstream.read(4096);
}
sstream.close();
fstream.close();
quickAddText = data + " " + dayVal + " " + timeVal;
清单 5 的代码表示将文本事件写到一个文件中并运行加密程序。清单 6 中的代码表示读入经 ASCII 封装的加密文本文件(附带了存储日期和时间的信息),然后重新启动快速添加文本的过程。
每个通过 Google Calendar Quick Add 程序添加的事件都被拦截、加密,然后以加密的形式发送到 Google 服务器。
完成对 chrome/content/hello.xul 中的事件进行加密的代码后,插入这些代码,解密 chrome/content/overlay.js 中的事件。插入 清单 7 中的行,从文件的末尾开始。
window.addEventListener("load", function() { calendarDecryptExtension.init(); }, false);
var calendarDecryptExtension = {
init: function() {
var appcontent = document.getElementById("appcontent"); // browser
if(appcontent)
appcontent.addEventListener("DOMContentLoaded", this.onPageLoad, true);
var messagepane = document.getElementById("messagepane"); // mail
if(messagepane)
messagepane.addEventListener("load", function () \
{ calendarDecryptExtension.onPageLoad(); }, false);
// above line split on \ for formatting, do not include the line break
},
事件显示页面每次加载时,都会通过 addEventListener 调用 calendarDecryptExtension 函数。calendarDecryptionExtension 函数开始是各种定义和挂钩,保证代码在页面装载时开始运行以及函数可以访问正确的数据。将 清单 8 中的代码置于清单 7 中的代码之下,继续文档解密过程:
onPageLoad: function(aEvent) {
dump("pre elemenet \n");
var elementData = "NODATA";
var allSpans = content.document.getElementsByTagName("span");
for (var n = 0; n < allSpans.length; n++){
if( allSpans[n].innerHTML.indexOf("BEGIN PGP") > -1 ){
// file output for encrypted event text
elementData = allSpans[n].innerHTML;
var fileOut = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
fileOut.initWithPath("/tmp/calendarEvent.temp");
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
.createInstance(Components. \
interfaces.nsIFileOutputStream);
// above line split on \ for formatting, do not include the line break
foStream.init(fileOut, 0x02 | 0x08 | 0x20, 0666, 0);
foStream.write(elementData, elementData.length);
foStream.close();
每个日程表条目都存在 HTML 的 span 元素中。临时变量设置完成后,一个 for 循环将处理每个 span 元素,并在文本加密后删除这些内容。下面的 清单 9 调用 CalendarCrypt.pl 程序,使用 "decrypt" 选项,提取事件文本。
// create an nsILocalFile for the executable
var fileExe = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
fileExe.initWithPath("/tmp/CalendarCrypt.pl");
var process = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess);
process.init(fileExe);
var args = ["decrypt"];
process.run(true, args, args.length);
将加密后的事件文本写到磁盘,然后运行解密程序,这将创建一个不加密的事件文本文件。添加 清单 10 中的代码将数据读回并更改呈现的信息。
// file input for decrypted event text
var data = "";
var fileIn = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
fileIn.initWithPath("/tmp/calendarEvent.decrypted");
var istream = Components.classes["@mozilla.org/network/file-input-stream;1"]
.createInstance(Components.interfaces.nsIFileInputStream);
istream.init(fileIn, 0x01, 0444, 0);
istream.QueryInterface(Components.interfaces.nsILineInputStream);
var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"]
.createInstance(Components.interfaces.nsIFileInputStream);
var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"]
.createInstance(Components. \
interfaces.nsIScriptableInputStream);
// above line split on \ for formatting, do not include the line break
fstream.init(fileIn, -1, 0, 0);
sstream.init(fstream);
var str = sstream.read(4096);
while (str.length > 0) {
data += str;
str = sstream.read(4096);
}
sstream.close();
fstream.close();
allSpans[n].innerHTML = data;
从文件读取文本类似于加密阶段中执行的过程。注意,清单 10 中的最后一行,它将当前的 span 数据设置为未加密文本,而不是 “BEGIN PGP…” 原始文本。 添加 清单 11 中的代码,完成解密过程。
// sanitize the data stored on disk
args = ["shred"];
process.run(true, args, args.length);
}//if the span item is encrypted
}//for each span
}//on page load
}//calendarDecryptExtension
将选项更改为 "shred" 并重用 nsiProcess 组件,确保加密后的事件文本安全地从文件系统的临时位置删除。下一部分给出了前面部分调用的 CalendarCrypt.pl 程序。
为了完成加密支持修改,需要根据下面的清单创建 CalendarCrypt.pl 程序。注意,对于典型 GnuPG 用户,给出的实现假设了一些最可能用到的加密/解密设置。如果愿意,可以考虑用 GnuPG::Encrypt 提供的其他选项替换外部程序调用和设置。例如,如果您希望使用多个键,或者 gpg-agent 与您的配置不兼容,GnuPG::Encrypt Perl 模块提供了许多帮助实现环境兼容的选项。首先,通过 清单 12 中的文本将 Perl 程序 calendarEncrypt.pl 置于 /tmp 中。
清单 12. calendarEncrypt.pl header 和加密
#!/usr/bin/perl -w
# calendarEncrypt.pl - encrypt/decrypt/shred files
use strict;
die "specify a mode " unless @ARGV == 1;
my $mode = $ARGV[0];
chomp(my $userName = `whoami`);
if( $mode eq "encrypt" )
{
my $res = `gpg --yes --armor --encrypt -r $userName /tmp/calendarEvent`;
$res = `shred /tmp/calendarEvent; rm /tmp/calendarEvent`;
在检查选项并设置默认用户名之后,将加密 /tmp/calendarEvent 文件。分解并删除原始的纯文本事件文件,确保磁盘上没有遗留敏感的数据。 下面的 清单 13 描述了解密模式:
}elsif( $mode eq "decrypt" )
{
open(INFILE,"/tmp/calendarEvent.temp") or die "no in file";
open(OUTFILE,"> /tmp/calendarEvent.encrypted" ) or die "no file out";
while(my $line =<INFILE>)
{
my $begin = substr( $line, 0, 23 );
print OUTFILE "-----$begin\n";
my $version = substr( $line, 23, 34 );
print OUTFILE "$version\n";
print OUTFILE "\n";
my $body = substr( $line, 57 );
$body = substr($body, 0, length($body)-26);
my @parts = split " ", $body;
for my $piece( @parts )
{
print OUTFILE "$piece\n";
}
print OUTFILE "-----END PGP MESSAGE-----\n";
}#while each line
close(OUTFILE);
close(INFILE);
my $cmd = qq{ gpg --yes --decrypt /tmp/calendarEvent.encrypted };
$cmd .= qq{ > /tmp/calendarEvent.decrypted };
my $res = `$cmd`;
在上传、处理或显示日程表事件的某个时刻,会丢失一些原始格式。尤其是 “BEGIN PGP” 消息的前缀 “—–” 以及换行指示,将被去除。在调用解密命令之前,清单 13 中的字符串操作函数将替换丢失的格式。最后,清单 14 中的代码负责安全删除解密文本文件,从而去除任何存储在磁盘上的纯文本信息。
}elsif( $mode eq "shred" )
{
my $res = `shred /tmp/calendarEvent.decrypted`;
$res = `rm /tmp/calendarEvent.decrypted`;
}
# EOF
在将文件保存为 /tmp/CalendarCrypt.pl 之后,要确保该文件在发出以下命令时执行:chmod a+x /tmp/CalendarCrypt.pl。
![]()
![]()
![]()
![]()
现在将拦截、加密使用 Google Calendar Quick Add 程序添加的事件,然后以加密的形式将其发布到 Google 服务器。使用 Extension Developer 的 Extension 重新加载所有的 chrome 事件,或重启 Firefox。使用 Ctrl+; 组合键,然后添加一个事件,比如 “Private doctor appointment tomorrow 16:30”。以 “regular” 模式打开您的 Google 日程表,您将看到一个事件描述,类似于 图 1 左边所示的内容。
要显示解密后的事件,请转到链接:http://www.google.com/calendar/htmlembed?src=<yourCalendarName>%40gmail.com,在这里,<yourCalendarName> 是您的帐户名,比如 “developer.works” 或 “bob_smith”。页面装载开始时,您会看到将弹出一个 gpg-agent,请求您的 passphrase。为 CalendarCrypt.pl 程序的第 1 小节中 “uname” 命令识别出的用户输入 passphrase,您的事件将被解密并显示在日程表上。
![]()
![]()
![]()
![]()
使用本文给出的工具和代码,您现在就可以在 Google 日程表中存储加密事件文本。使用 Elias Torres 的 Google Calendar Quick Add Firefox 扩展的修改,对每个添加和查看的事件进行无缝的加密和解密。在重新掌控数据的同时,也获得了 Web 2.0 应用程序带来的好处。
考虑创建一个模糊层(obfuscation layer)来更改事件存储的时间,降低网络流量分析的效率。编写您自己的程序,借助 Google Calendar SOAP API 提取、加密和存储以前和将来的日程表事件。尝试为默认的 Google Calendar 接口创建一个具有 Ajax 风格的透明加密扩展。
from http://www.ibm.com/developerworks/cn/web/wa-googlecal/index.html
学如逆水行舟,不进则退
最近在玩AJAX,已经是很落伍的东西了,记得2006年在北京工作时有人提到这个概念,当时因为主要做linux下的c++开发,没有关注他。现在发现真的是很好用。今天去了IBM的网站,发现好多好多内容啊,真的感觉自己都OUT了。这世界变化真大。要跟上时代步伐也真不容易啊。
前天晚上帮一个同学演练presentation,昨天晚上和一个肢体聊天,都发现,我们真的是每一封中都在不停的工作工作,看paper,写代码,搞设计,做仿真,一步都不能歇。否则人家在进步,自己吃老本,实际上就是在退步了。
记得在国内上海参加ICSICP会议的时候,有同学就说,董老师是时刻处于工作状态,只要人没睡觉,就在笔记本上不停的捣鼓,不知道在捣鼓什么,估计是在发电邮或者写文档吧。
自己其实也没闲着,没时间看电视,没时间玩游戏,甚至觉得如果可以不吃饭不睡觉那该多好?然后用在research上的时间还是不够啊。
转载:JSON 入门指南
from http://www.ibm.com/developerworks/cn/web/wa-lo-json/index.html
JSON 入门指南
![]()
![]()
文档选项
![]()
未显示需要 JavaScript 的文档选项
![]()
![]()
![]()
级别: 初级
廖 雪峰, 撰稿人
2008 年 8 月 22 日
JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。本文将快速讲解 JSON 格式,并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理。
尽管有许多宣传关于 XML 如何拥有跨平台,跨语言的优势,然而,除非应用于 Web Services,否则,在普通的 Web 应用中,开发者经常为 XML 的解析伤透了脑筋,无论是服务器端生成或处理 XML,还是客户端用 JavaScript 解析 XML,都常常导致复杂的代码,极低的开发效率。实际上,对于大多数 Web 应用来说,他们根本不需要复杂的 XML 来传输数据,XML 的扩展性很少具有优势,许多 AJAX 应用甚至直接返回 HTML 片段来构建动态 Web 页面。和返回 XML 并解析它相比,返回 HTML 片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。
现在, JSON 为 Web 应用开发者提供了另一种数据交换格式。让我们来看看 JSON 到底是什么,同 XML 或 HTML 片段相比,JSON 提供了更好的简单性和灵活性。
![]()
请访问 Ajax 资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。
和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象。
String,Number 和 Boolean 用 JSON 表示非常简单。例如,用 JSON 表示一个简单的 String “ abc ”,其格式为:
"abc"
除了字符 ",\,/ 和一些控制符(\b,\f,\n,\r,\t)需要编码外,其他 Unicode 字符可以直接输出。下图是一个 String 的完整表示结构:

一个 Number 可以根据整型或浮点数表示如下:

这与绝大多数编程语言的表示方法一致,例如:
12345(整数) -3.9e10(浮点数)
Boolean 类型表示为 true 或 false 。此外,JavaScript 中的 null 被表示为 null,注意,true、false 和 null 都没有双引号,否则将被视为一个 String 。
JSON 还可以表示一个数组对象,使用 [] 包含所有元素,每个元素用逗号分隔,元素可以是任意的 Value,例如,以下数组包含了一个 String,Number,Boolean 和一个 null:
["abc",12345,false,null]
Object 对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map<String, Object>,而不是 Java 的 Class 。注意 Key 只能用 String 表示。
例如,一个 Address 对象包含如下 Key-Value:
city:Beijing street:Chaoyang Road postcode:100025(整数)
用 JSON 表示如下:
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
其中 Value 也可以是另一个 Object 或者数组,因此,复杂的 Object 可以嵌套表示,例如,一个 Person 对象包含 name 和 address 对象,可以表示如下:
{"name":"Michael","address":
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
}
上面介绍了如何用 JSON 表示数据,接下来,我们还要解决如何在服务器端生成 JSON 格式的数据以便发送到客户端,以及客户端如何使用 JavaScript 处理 JSON 格式的数据。
我们先讨论如何在 Web 页面中用 JavaScript 处理 JSON 数据。我们通过一个简单的 JavaScript 方法就能看到客户端如何将 JSON 数据表示给用户:
function handleJson() {
var j={"name":"Michael","address":
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
};
document.write(j.name);
document.write(j.address.city);
}
假定服务器返回的 JSON 数据是上文的:
{"name":"Michael","address":
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
}
只需将其赋值给一个 JavaScript 变量,就可以立刻使用该变量并更新页面中的信息了,相比 XML 需要从 DOM 中读取各种节点而言,JSON 的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求,然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理 JSON 数据的能力,例如 Prototype(一个流行的 JavaScript 库:http://prototypejs.org)提供了 evalJSON() 方法,能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量:
new Ajax.Request("http://url", {
method: "get",
onSuccess: function(transport) {
var json = transport.responseText.evalJSON();
// TODO: document.write(json.xxx);
}
});
下面我们讨论如何在服务器端输出 JSON 格式的数据。以 Java 为例,我们将演示将一个 Java 对象编码为 JSON 格式的文本。
将 String 对象编码为 JSON 格式时,只需处理好特殊字符即可。另外,必须用 (") 而非 (') 表示字符串:
static String string2Json(String s) {
StringBuilder sb = new StringBuilder(s.length()+20);
sb.append('\"');
for (int i=0; i<s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '\"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '/':
sb.append("\\/");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
default:
sb.append(c);
}
}
sb.append('\"');
return sb.toString();
}
将 Number 表示为 JSON 就容易得多,利用 Java 的多态,我们可以处理 Integer,Long,Float 等多种 Number 格式:
static String number2Json(Number number) {
return number.toString();
}
Boolean 类型也可以直接通过 toString() 方法得到 JSON 的表示:
static String boolean2Json(Boolean bool) {
return bool.toString();
}
要将数组编码为 JSON 格式,可以通过循环将每一个元素编码出来:
static String array2Json(Object[] array) {
if (array.length==0)
return "[]";
StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (Object o : array) {
sb.append(toJson(o));
sb.append(',');
}
// 将最后添加的 ',' 变为 ']':
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
最后,我们需要将 Map<String, Object> 编码为 JSON 格式,因为 JavaScript 的 Object 实际上对应的是 Java 的 Map<String, Object> 。该方法如下:
static String map2Json(Map<String, Object> map) {
if (map.isEmpty())
return "{}";
StringBuilder sb = new StringBuilder(map.size() << 4);
sb.append('{');
Set<String> keys = map.keySet();
for (String key : keys) {
Object value = map.get(key);
sb.append('\"');
sb.append(key);
sb.append('\"');
sb.append(':');
sb.append(toJson(value));
sb.append(',');
}
// 将最后的 ',' 变为 '}':
sb.setCharAt(sb.length()-1, '}');
return sb.toString();
}
为了统一处理任意的 Java 对象,我们编写一个入口方法 toJson(Object),能够将任意的 Java 对象编码为 JSON 格式:
public static String toJson(Object o) {
if (o==null)
return "null";
if (o instanceof String)
return string2Json((String)o);
if (o instanceof Boolean)
return boolean2Json((Boolean)o);
if (o instanceof Number)
return number2Json((Number)o);
if (o instanceof Map)
return map2Json((Map<String, Object>)o);
if (o instanceof Object[])
return array2Json((Object[])o);
throw new RuntimeException("Unsupported type: " + o.getClass().getName());
}
我们并未对 Java 对象作严格的检查。不被支持的对象(例如 List)将直接抛出 RuntimeException 。此外,为了保证输出的 JSON 是有效的,Map<String, Object> 对象的 Key 也不能包含特殊字符。细心的读者可能还会发现循环引用的对象会引发无限递归,例如,精心构造一个循环引用的 Map,就可以检测到 StackOverflowException:
@Test(expected=StackOverflowError.class)
public void testRecurrsiveMap2Json() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key", map);
JsonUtil.map2Json(map);
}
好在服务器处理的 JSON 数据最终都应该转化为简单的 JavaScript 对象,因此,递归引用的可能性很小。
最后,通过 Servlet 或 MVC 框架输出 JSON 时,需要设置正确的 MIME 类型(application/json)和字符编码。假定服务器使用 UTF-8 编码,则可以使用以下代码输出编码后的 JSON 文本:
response.setContentType("application/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.write(JsonUtil.toJson(obj));
pw.flush();
JSON 已经是 JavaScript 标准的一部分。目前,主流的浏览器对 JSON 支持都非常完善。应用 JSON,我们可以从 XML 的解析中摆脱出来,对那些应用 Ajax 的 Web 2.0 网站来说,JSON 确实是目前最灵活的轻量级方案。
转载:使用隐写术躲避探察
from http://www.ibm.com/developerworks/cn/web/wa-steganalysis/index.html
使用隐写术躲避探察
制造视觉盲点
文档选项
未显示需要 JavaScript 的文档选项
级别: 中级
Sean-Philip Oriyano, IT 讲师, Independent Consultant
2009 年 7 月 27 日
隐写术(Steganography)是一种隐藏信息的技术,它使用某种格式使得不了解它的人很难检测到信息的位置。在计算机世界中,隐写术已经成为一种非常高级的技术,它能以各种数据文件类型隐藏信息,比如图片、文档和硬盘空间。本文将介绍潜在的攻击者如何利用这种技术、有关隐写术的深入信息,以及它所使用的探察技术。
隐写术是一项历史悠久的技术。这项强大的技术曾经在 9/11 恐怖袭击事件中充当了联络员的角色,因而备受关注。它使恐怖分子、极端分子能够用难以侦测的方式进行交流。本文将探讨隐写术的原理并展示如何侦测它的使用。
在开始之前,请允许我首先将它与另一种改变数据以防止未授权查看的方法区分一下,这种方法就是 加密。加密可以将明文(或未加密信息)变成加密文(或加密信息)。加密无法 做什么呢?它无法阻止别人知道该数据的传输,因为加密数据可以被破解。但没有所有重要的键,破解也并不容易。与此相比,隐写术 在其他数据中隐藏加密数据,而别人没有意识到自己看到的只是表面数据,不知道里面还隐藏了数据。为什么要使用这种技术而不是其他技术?简单来说,如果您传输一条加密消息,它反而会吸引那些您不希望吸引来的人,而隐写术可以在第三方眼皮底下进行交流而不会引起怀疑。
让我们看看整个过程是如何进行的,如果不了解一些基础知识的话这将很难理解。
在本例中,考虑一种常见的图片格式,比如 JPEG。JPEG 文件用途广泛并且受支持程度高,最重要的是,它支持 1670 万种颜色(人眼可以识别的最大颜色数),因此非常流行。现在再考虑一张高端相机拍摄的标准数码照片,可以是任何给定的事物,日落、海滩或者拉斯维加斯大道。这些事物可以包含许多颜色和细节,以及各种所谓的白噪点(取决于使用的相机)。
那么什么是白噪点呢?它是包含在任何数据片中的背景或随机信息。在本例中,可以将它视为图片中保存的难以发现或者没有用的信息。利用隐写术技术的人可以使用白噪点隐藏 “秘密” —— 以难以察觉的方式转变信息。在这种图片中,每个像素都由用来指定要显示的颜色的成员组成。
在任何标准图片中,像素是三个相关联的成员序列,这三个成员指示像素的红、绿、蓝(RGB)通道的混合度(因而能指定颜色)。在一个 RGB 值中,任何给定的通道都可以包含一个从 0(无色)到 255(完整颜色)的值。在数字世界的上下文中,所有这些值都以 8 位的序列存储,Most Significant Bit(最高有效位,MSB)为 128,Least Significant Bit(最低有效位,LSB)为 1。让我们看看标准的像素:
原像素值:255, 255, 255(白色) 该像素值二进制表示形式:11111111, 11111111, 11111111
现在,改变该像素来存储数据:
现在的像素值为:255, 255, 255(白色) 该像素值二进制表示形式:111111rr, 111111gg, 111111bb
在新的示例中,我在每个通道标记了 LSB 以引起注意。在现实中,我可以跨几个像素改变这些通道的 LSB,以存储与字母有关的代码。因为大部分字母只需要 8 位,在图片的每个像素中能用的位比这多很多。记住,当我使用每个像素的 4 个 LSB 描述文本的字母时,这一更改也会改变像素的颜色;但是,在每个像素中存储一个字母需要做出的更改非常细微,因此更改后的颜色变化是非常细微的 —— 细微到肉眼根本无法察觉。除非您有原图片,否则要发现新图片与原图片之间的变化是一项非常艰难的任务(尽管有软件可以帮助侦测到这种变化)。
理解了如何改变像素来存储文本信息(或者其他数据)之后,我们可以进入下一个步骤,即计算大小。设想一个大小为 1024 x 768 像素的 JPEG 图片(这个大小是很常见的)。如果计算一下您就知道,该大小的图片可以包含约 800,000 个像素 —— 这个数量的像素可以包含很多信息了。那么大小为 1200 x 1600 像素的图片呢?该图片大小包含 100 万像素,每个像素都可以使用这种方法改变。它足以携带一本小说的信息,而且还有空闲!
![]()
![]()
那么,您如何执行该步骤呢?有很多工具可以执行该步骤,包括在线工具和可下载工具。此外,有些工具可以用来侦测使用隐写术隐藏的信息 —— 这一过程称为隐写术解密(steganalysis)。
目前,您可以使用工具对各种媒体类型执行隐写加密。在这里,我介绍一些有用的工具(主要是基于图片的工具),它们工具可以对一些常见的媒体类型应用该技术。
Hiding Glyph 应用程序可以以标准、未压缩的 24 位(或更大)位图图片存储文件或者文件组。该应用程序的好处在于,您可以选择任何包含各种颜色的图片作为隐藏文件的位置,使其躲避侦测。此外,如果不是同时拥有原文件和改变后的文件,侦测几乎是不可能的,更不用说提取实际的信息了。
Vecna 是一个有趣的应用程序,可以使用 我在上文描述的方法 在图片中隐藏数据。Vecna 具有基于 Java™ 应用程序的优点,因此可以使用 Java 语言可以读取的图片格式作为存储数据的位置。在图片中嵌入信息后,得到的数据可以输出为一个 PNG 文件,使用 alpha 通道信息来携带数据。
该应用程序使用一个非常有趣的方法存储隐藏信息:以随机方式将添加的信息分散到图片中。Vecna 利用自己的随机数字生成器实现数据的相对混乱级别。还值得一提的是,该应用程序用来隐藏数据的技术也可以用来在图片中存储所有类型的数据,包括文本、 Portable Data Format (PDF)、甚至其他图片。
TrueCrypt 是一个常用的工具,可以执行大量数据的加密操作,但是它还提供了一个额外的保护层,在已经加密的卷中隐藏一个卷。您可以使用 TrueCrypt 创建最初的加密卷,然后使用加密卷中的空闲空间隐藏其他数据。TrueCrypt 声称该功能给出了一种合理的推诿,因为他人可以轻松发现存在加密卷,但是即使某人设法获取了卷密码并打开了卷,但是侦测隐藏卷的机会几乎是不可能的,即使这个人怀疑到里面藏有数据。
TrueCrypt 的功能值得一提,因此请允许我再提几件事情。首先,TrueCrypt 能够以与图片相同的方式隐藏文件,这不奇怪,该技术与我讨论过的图片技术类似。如果要保护和隐藏的数据量很大,TrueCrypt 就有了用武之地。实际上,TrueCrypt 不仅能够隐藏文件,还能够隐藏整个操作系统。
F5 是另一个以前开发的隐写术应用程序,最近进行了一些改进,让它更加有用。基本上,F5 是另一个隐藏数据的工具,比如在图片(如 JPEG)中存储 .txt 或 .doc 文件。
现在我们进入一个新的领域。我不想介绍该工具 “如何如何”,只想提醒您这是另一个利用隐写式加密术的工具。您可以使用 mp3stego 在适合原数据大小的 MP3 文件中隐藏数据(顾名思义)。基本上这个流程是这样的:您获取 .wav 文件,在其中隐藏数据,然后将 .wav 文件压缩到 MP3 文件。该格式的好处在于,您可以似乎用它轻松地以纯格式或者看似简单的格式隐藏任何类型的数据。
回想之前提过的基于图片的技术,您就明白了该过程的可能性。MP3 文件和图片代表了各种分发隐藏数据的方法。图片文件可以在网站上发布,而没有人会怀疑展示的是秘密数据,例如,在体育图片中发布一些机密数据(绝对是您最想不到的机密隐藏地)。例如,相比之下,MP3 文件可以嵌入数据并发布到 BitTorrent。一次会议的演讲可以加入数据并上传,下载该文件的人可能很久都不会发现它隐藏了一些内容。
该应用程序包是一个商业软件套件,包含一个隐写式实用程序的工具箱,以及其他掩藏踪迹的工具。Steganos Privacy Suite 可以选择现有文件并在其中嵌入数据,也可以创建一个图片或声音文件来携带数据。实际上,该套件可以接入扫描仪或者附加麦克风来创建携带数据的文件。此外,如果您无法确定用于存储秘密数据的最佳文件类型,Steganos 可以帮助您扫描硬盘以确定隐藏信息的最佳方式。
想让事情更加有趣吗?如果希望隐藏数据,或者至少难以侦测,您应该给隐藏的秘密再加一层保护。使用这种技术,伪装的数据将能够阻扰侦测,让原本浑浊的水变得更加浑浊不堪,侦测者将难以确定哪些是实际数据哪些不是。当然,还要注意,添加的数据会增加他人作为隐藏信息搜索位置的可能性。
![]()
![]()
当然,每一种方法都有破解的方法,隐写术也不例外。在本例中,破解方法是一种名为 steganalysis 的技术。隐写式密码解密的目的非常简单:侦测可疑数据,确定数据中是否隐藏了信息,然后揭露该数据。
表面看来,该过程就像是类似解密 的技术。但实际上,它们是不一样的。使用隐写式密码解密,您需要观察数据并确定它是否加密。使用隐写式密码解密,数据的显示是不确定的。
最简单最基本的方法是,使用统计分析技术执行隐写式密码解密。该技术使用一些方法比较已知、未修改的文件与可疑的文件,可以比较已知文件和可疑文件的 “指纹”。通过这种统计比较,理论上可以侦测到常见文件的变化。关键在于,已知的原文件必须与可疑文件出处相同(即数码相机或扫描仪),或者尽可能的匹配,这样才能有效检测。该技术的一种变体是查找已知压缩算法在 JPEG、MP3 和其他文件上的偏差,因为压缩算法都是公开的。
还有一种更高级的技术 —— Noise Floor Consistency Analysis。简而言之,该方法在数据片的 MSB 和 LSB 组件之间的位级别进行。因为 MSB 和 LSB 之间应该有一些基本的关联,有些隐写术会改变 LSB,因而可能打破这种关系,这给侦测带来了可乘之机。实际上,有些执行该技术的应用程序可以高度可靠地检测隐藏数据。
对于隐写式密码解密技术需要记住的一点是,另一个复杂的层可能添加到隐藏数据。想想看:如果希望添加另一个元素来保护隐藏数据,您应该在嵌入数据前进行加密。在这种情况下,即使侦测成功,也必须执行解密操作。
隐写式密码解密工具像大部分安全工具一样,往往价格不菲。但是,如果只是想探讨其中一些技术,那么有一个开源项目 Stegsecret(见 参考资料)可供您研究。
![]()
![]()
对于第一次见到该方法的人来说,这是个很难回答的问题。请允许我介绍一些使用该技术的应用程序。记住,就像所有的工具一样,该方法既可以用于合法的目的,也可以用于非法的目的,这取决于使用它们的人。合法使用的应用程序包括保护知识产权(如版权) —— 给图片加上所谓的水印。相反,违法的目的包括出于法律原因隐藏信息,实际上,我们知道基地组织以及其他组织使用该技术在网站上的普通图片中隐藏信息。
那么,如何能阻止使用隐写术传输和存储非法信息呢?可以说这是一个很难回答的问题。在正确的人手中,可以轻松地在 “常见” 文件中隐藏信息并随身携带。记住,如果操作正确,信息可以隐藏在任何图片、文档或者其他数据片段中,而不会受到怀疑。尽管您无法确定该技术在非法或犯罪领域的使用范围,但可以肯定的是,罪犯、恐怖分子以及其他恶作剧者肯定在使用它。作为 “正义的一方”,我们可以使用公司安全策略和荣誉准则防止该技术的滥用。不幸的是,那些 “邪恶势力” 没有这些限制。
![]()
![]()
隐写术是一种使用广泛而有效的技术,可以在常见的文件中隐藏信息。尽管有一些侦测隐藏数据的方法,但它们都不是完全可靠的,没有 100% 有效的工具。如果希望侦测和破解该技术,必须要结合技术和警觉,这样才能增加成功的机会。
学习
- 有关 隐写式加密术的背景知识,请查看 Wikipedia。Wikipedia 还提供了有关 密码学 的许多信息。
- 在 securityfocus.com 获取最新的安全新闻和信息。
- SANS Institute 是安全信息、认证程序和研究的一站式商店。
- developerWorks Web 开发专区 提供大量用于 Web 2.0 开发的工具和信息。
- developerWorks 技术活动和网络广播:随时关注 developerWorks 技术活动和网络广播。
- 使用 My developerWorks 定制您的 developerWorks 体验。
获得产品和技术
- TrueCrypt 是一个开源工具,为 Windows®、Mac OS X 和 Linux® 系统提供数据加密。
- 基于图片的隐写式加密术工具包括 Hiding Glyph 和 Vecna。
- mP3stego 使您能在 MP3 文件中隐藏数据。
- Steganos Privacy Suite 是一个商业工具集,可以提供数据保护、密码管理等等。
- 使用开源 (GNU/GPL) 工具 Stegsecret 研究隐写式密码解密术。
自 1990 年以来,Sean-Philip Oriyano 就一直积极致力于 IT 领域。在他的整个职业生涯中,他曾经担任过顾问支持专家和高级讲师等诸多职位。如今,他是一名 IT 讲师,专门研究各种公共和私有实体的基础设施和安全主题。Sean 曾经效力于驻扎在北美以及全球其他地方的美国空军、美国海军和美国陆军。他通过了 CISSP、CHFI、CEH、 CEI、 CNDA、SCNP、SCPI、 MCT、MCSE、和 MCITP 认证,此外他还
Godwithus神同在网站推出:搜索和网址
http://godwithus.cc Godwithus神同在主内搜索
http://sites.godwithus.cc Godwithus神同在主内网址
征求意见中,欢迎访问并提出宝贵的改进意见。
Godwithus神与我们同在 首页 主页 | 博客 播客 社区 | 中国站 美国站 移动站 | 搜索 网址 导航 帮助 | 关于
探讨:当前教会最缺什么?真理、知识还是爱?
在牧者之杖QQ群,讨论现在华人教会的问题和需要如何管理。上海的周弟兄,改革宗背景,他说,目前教会中最缺的就是“真理”,而我们很多其他几个人就反对他,说最缺的是“爱”,而真伪辨群的云姊妹也曾问过,到底什么是“爱”。我当时就说,改革宗的人就容易犯这个错误,动不动就真理真理,其实是在构筑“知识”的巴别塔。我们最后也达成一致,耶稣就是“真理”,神就是“爱”,而真理不是很多半瓶醋两把刀的改革宗的人所热吹的“知识”,尤其是那种上知五百年下知五百载上天入地从哲学到逻辑学无所不知无所不晓的那种“知识”。我们也觉得,“改革宗”的名声都被这些人给搞臭了,整天的论断、“真理”、嫉恶如仇、看不到爱心。我们自己也要小心,在没有成为真正的改革宗的人之前,不要说自己是改革宗的,之说我们认同改革宗的观点。
我不知道部分吃改革宗观点的人的“当前最重要的是真理”这个观点哪里来的。我圣经读的不多,然后还真没印象圣经中哪里说到目前最重要的是“真理”
借助查经工具,我们可以搜到,和合本圣经中“真理”共出现66次。我听有人说过圣经中“不要害怕”出现365还是366次也就是说每天都不用害怕,刚才查了一下“害怕”67次,“怕”519次。再看看“爱”,827次。按照唐牧师的做法,圣经中哪个词或者事件、观点出现的次数多,哪个词就是圣经中更重要的,因此,从数量来说,“爱”是真理的12.53倍,即每个月“爱”都比“真理”重要,而“真理”和“害怕”的重要性差不多。
有些“归正宗者”又会说,“真理”是一切的根本和基础,没有“真理”一切都是假的。让我们来看看圣经中怎么样说真理的:
【诗25:5】 求你以你的真理引导我,教训我。因为你是救我的神。我终日等候你。
guide me in your truth and teach me, for you are God my Savior, and my hope is in you all day long.
【诗26:3】 因为你的慈爱常在我眼前。我也按你的真理而行。
for your love is ever before me, and I walk continually in your truth.
【诗45:4】 为真理,谦卑,公义,赫然坐车前往,无不得胜。你的右手必显明可畏的事。
In your majesty ride forth victoriously in behalf of truth, humility and righteousness; let your right hand display awesome deeds.
【诗60:4】 你把旌旗赐给敬畏你的人,可以为真理扬起来。(细拉)
But for those who fear you, you have raised a banner to be unfurled against the bow.
【诗86:11】 耶和华阿,求你将你的道指教我。我要照你的真理行。求你使我专心敬畏你的名。
Teach me your way, O Lord , and I will walk in your truth; give me an undivided heart, that I may fear your name.
【诗119:43】 求你叫真理的话,总不离开我口。因我仰望你的典章。
Do not snatch the word of truth from my mouth, for I have put my hope in your laws.
【箴8:7】 我的口要发出真理。我的嘴憎恶邪恶。
My mouth speaks what is true, for my lips detest wickedness.
【箴23:23】 你当买真理。就是智慧,训诲,和聪明,也都不可卖。
Buy the truth and do not sell it; get wisdom, discipline and understanding.
【但8:12】 因罪过的缘故,有军旅和常献的燔祭交付它。它将真理抛在地上,任意而行,无不顺利。
Because of rebellion, the host of the saints and the daily sacrifice were given over to it. It prospered in everything it did, and truth was thrown to the ground.
【但9:13】 这一切灾祸临到我们身上是照摩西律法上所写的,我们却没有求耶和华我们神的恩典,使我们回头离开罪孽,明白你的真理。
Just as it is written in the Law of Moses, all this disaster has come upon us, yet we have not sought the favor of the Lord our God by turning from our sins and giving attention to your truth.
【约1:14】 道成了肉身住在我们中间,充充满满的有恩典有真理。我们也见过他的荣光,正是父独生子的荣光。
The Word became flesh and made his dwelling among us. We have seen his glory, the glory of the One and Only, who came from the Father, full of grace and truth.
【约1:17】 律法本是借着摩西传的,恩典和真理,都是由耶稣基督来的。
For the law was given through Moses; grace and truth came through Jesus Christ.
【约3:21】 但行真理的必来就光,要显明他所行的是靠神而行。
But whoever lives by the truth comes into the light, so that it may be seen plainly that what he has done has been done through God.’
【约5:33】 你们曾差人到约翰那里,他为真理作过见证。
‘You have sent to John and he has testified to the truth.
【约8:32】 你们必晓得真理,真理必叫你们得以自由。
Then you will know the truth, and the truth will set you free.’
【约8:40】 我将在神那里所听见的真理,告诉了你们,现在你们却想要杀我。这不是亚伯拉罕所行的事。
As it is, you are determined to kill me, a man who has told you the truth that I heard from God. Abraham did not do such things.
【约8:44】 你们是出于你们的父魔鬼,你们父的私欲,你们偏要行,他从起初是杀人的,不守真理。因他心里没有真理,他说谎是出于自己,因他本来是说谎的,也是说谎之人的父。
You belong to your father, the devil, and you want to carry out your father’s desire. He was a murderer from the beginning, not holding to the truth, for there is no truth in him. When he lies, he speaks his native language, for he is a liar and the father of lies.
【约8:45】 我将真理告诉你们,你们就因此不信我。
Yet because I tell the truth, you do not believe me!
【约8:46】 你们中间谁能指证我有罪呢?我既然将真理告诉你们,为什么不信我呢?
Can any of you prove me guilty of sin? If I am telling the truth, why don’t you believe me?
【约14:6】 耶稣说,我就是道路,真理,生命。若不借着我。没有人能到父那里去。
Jesus answered, ‘I am the way and the truth and the life. No one comes to the Father except through me.
【约14:17】 就是真理的圣灵,乃世人不能接受的。因为不见他,也不认识他。你们却认识他。因他常与你们同在,也要在你们里面。
the Spirit of truth. The world cannot accept him, because it neither sees him nor knows him. But you know him, for he lives with you and will be in you.
【约15:26】 但我要从父那里差保惠师来,就是从父出来真理的圣灵。他来了,就要为我作见证。
‘When the Counselor comes, whom I will send to you from the Father, the Spirit of truth who goes out from the Father, he will testify about me.
【约16:13】 只等真理的圣灵来了,他要引导你们明白(原文作进入)一切的真理。因为他不是凭自己说的,乃是把他所听见的都说出来。并要把将来的事告诉你们。
But when he, the Spirit of truth, comes, he will guide you into all truth. He will not speak on his own; he will speak only what he hears, and he will tell you what is yet
to come.
【约17:17】 求你用真理使他们成圣。你的道就是真理。
Sanctify them by the truth; your word is truth.
【约17:19】 我为他们的缘故,自己分别为圣,叫他们也因真理成圣。
For them I sanctify myself, that they too may be truly sanctified.
【约18:37】 彼拉多就对他说,这样,你是王吗?耶稣回答说,你说我是王。我为此而生,也为此来到世间,特为给真理作见证。凡属真理的人,就听我的话。
‘You are a king, then!’ said Pilate. Jesus answered, ‘You are right in saying I am a king. In fact, for this reason I was born, and for this I came into the world, to testify to the truth. Everyone on the side of truth listens to me.’
【约18:38】 彼拉多说,真理是什么呢?说了这话,又出来到犹太人那里,对他们说,我查不出他有什么罪来。
‘What is truth?’ Pilate asked. With this he went out again to the Jews and said, ‘I find no basis for a charge against him.
【罗1:18】 原来神的忿怒,从天上显明在一切不虔不义的人身上,就是那些行不义阻挡真理的人。
The wrath of God is being revealed from heaven against all the godlessness and wickedness of men who suppress the truth by their wickedness,
【罗2:2】 我们知道这样行的人,神必照真理审判他。
Now we know that God’s judgment against those who do such things is based on truth.
【罗2:8】 惟有结党不顺从真理,反顺从不义的,就以忿怒恼恨报应他们。
But for those who are self-seeking and who reject the truth and follow evil, there will be wrath and anger.
【罗2:20】 是蠢笨人的师傅,是小孩子的先生,在律法上有知识和真理的模范。
an instructor of the foolish, a teacher of infants, because you have in the law the embodiment of knowledge and truth–
【罗15:8】 我说,基督是为神真理作了受割礼人的执事,要证实所应许列祖的话。
For I tell you that Christ has become a servant of the Jews on behalf of God’s truth, to confirm the promises made to the patriarchs
【林前13:6】 不喜欢不义。只喜欢真理。
Love does not delight in evil but rejoices with the truth.
【林后4:2】 乃将那些暗昧可耻的事弃绝了,不行诡诈,不谬讲神的道理。只将真理表明出来,好在神面前把自己荐与各人的良心。
Rather, we have renounced secret and shameful ways; we do not use deception, nor do we distort the word of God. On the contrary, by setting forth the truth plainly we commend ourselves to every man’s conscience in the sight of God.
【林后13:8】 我们凡事不能敌挡真理,只能扶助真理。
For we cannot do anything against the truth, but only for the truth.
【加2:5】 我们就是一刻的工夫,也没有容让顺服他们,为要叫福音的真理仍存在你们中间。
We did not give in to them for a moment, so that the truth of the gospel might remain with you.
【加2:14】 但我一看见他们行的不正,与福音的真理不合,就在众人面前对矶法说,你既是犹太人,若随外邦人行事,不随犹太人行事,怎么还勉强外邦人随犹太人呢?
When I saw that they were not acting in line with the truth of the gospel, I said to Peter in front of them all, ‘You are a Jew, yet you live like a Gentile and not like a Jew. How is it, then, that you force Gentiles to follow Jewish customs?
【加4:16】 如今我将真理告诉你们,就成了你们的仇敌吗?
Have I now become your enemy by telling you the truth?
【加5:7】 你们向来跑得好。有谁拦阻你们,叫你们不顺从真理呢?
You were running a good race. Who cut in on you and kept you from obeying the truth?
【弗1:13】 你们既听见真理的道,就是那叫你们得救的福音,也信了基督,既然信他,就受了所应许的圣灵为印记。
And you also were included in Christ when you heard the word of truth, the gospel of your salvation. Having believed, you were marked in him with a seal, the promised Holy Spirit,
【弗4:21】 如果你们听过他的道,领了他的教,学了他的真理,
Surely you heard of him and were taught in him in accordance with the truth that is in Jesus.
【弗4:24】 并且穿上新人。这新人是照着神的形像造的,有真理的仁义,和圣洁。
and to put on the new self, created to be like God in true righteousness and holiness.
【弗6:14】 所以要站稳了,用真理当作带子束腰,用公义当作护心镜遮胸。
Stand firm then, with the belt of truth buckled around your waist, with the breastplate of righteousness in place,
【西1:5】 是为那给你们存在天上的盼望。这盼望就是你们从前在福音真理的道上所听见的。
the faith and love that spring from the hope that is stored up for you in heaven and that you have already heard about in the word of truth, the gospel
【帖后2:10】 并且在那沉沦的人身上,行各样出于不义的诡诈。因他们不领受爱真理的心,使他们得救。
and in every sort of evil that deceives those who are perishing. They perish because they refused to love the truth and so be saved.
【帖后2:12】 使一切不信真理,倒喜爱不义的人,都被定罪。
and so that all will be condemned who have not believed the truth but have delighted in wickedness.
【提前3:15】 倘若我耽延日久,你也可以知道在神的家中当怎样行。这家就是永生神的教会,真理的柱石和根基。
if I am delayed, you will know how people ought to conduct themselves in God’s household, which is the church of the living God, the pillar and foundation of the truth.
【提前6:5】 并那坏了心术,失丧真理之人的争竞。他们以敬虔为得利的门路。
and constant friction between men of corrupt mind, who have been robbed of the truth and who think that godliness is a means to financial gain.
【提后2:15】 你当竭力,在神面前得蒙喜悦,作无愧的工人,按着正意分解真理的道。
Do your best to present yourself to God as one approved, a workman who does not need to be ashamed and who correctly handles the word of truth.
【多1:1】 神的仆人,耶稣基督的使徒保罗,凭着神选民的信心,与敬虔真理的知识,
Paul, a servant of God and an apostle of Jesus Christ for the faith of God’s elect and the knowledge of the truth that leads to godliness–
【彼前1:22】 你们既因顺从真理,洁净了自己的心,以致爱弟兄没有虚假,就当从心里彼此切实相爱。从心里有古卷作从清洁的心
Now that you have purified yourselves by obeying the truth so that you have sincere love for your brothers, love one another deeply, from the heart.
【约一1:6】 我们若说是与神相交,却仍在黑暗里行,就是说谎话,不行真理了。
If we claim to have fellowship with him yet walk in the darkness, we lie and do not live by the truth.
【约一1:8】 我们若说自己无罪,便是自欺,真理不在我们心里了。
If we claim to be without sin, we deceive ourselves and the truth is not in us.
【约一2:4】 人若说我认识他,却不遵守他的诫命,
好消息音乐河春节特别节目
91分钟的好消息音乐河春节特别节目,喜恩和邰正宵联袂主持,台湾原住民的无伴奏合唱,参观有47年历史的“天韵”诗班、赞美之泉、约书亚影音工作室等。
http://www.tudou.com/programs/view/qXUABflyWEU/
神同在博客升级为多用户版,服务主内弟兄姊妹
欢迎来申请个人博客,获得如 your_name.blog.godwithus.cc的域名,使用全世界上最好的WordPress博客工具,支持中文英文等多种语言。 例如:http://huo.blog.godwithus.cc Godwithus神与我们同在网站http://godwithus.cc
推荐:神同在主内搜索模块
感谢主,终于做好了,神同在主内搜索模块。
神同在主内搜索模块,演示页面 http://godwithus.cc/ 或者 http://inlord.cn
使用方法
本功能为可以引用模块,使用了最新的Ajax技术和Google Ajax Search API。使用方法如下:
1 在源文件的HEAD头之间引用如下两行脚本:
http://www.google.com/jsapi?key=ABQIAAAAfCpp0_0baMYKpGvoNvfSIhSgVKQe7L6 2U3QBJDYXgOCIyvKcIRQfcyMwEUXhW0uH8bBSI01RnCqv4w"
http://godwithus.cc/search.js
2 在文件体BODY之间的适当位置调用如下函数:
showGodwithusSearch();
详见:http://godwithus.cc/help.php

