當前位置:首頁 » 操作系統 » sha1c源碼

sha1c源碼

發布時間: 2024-06-20 08:15:20

php的openssl_sign($data,$sign,$private_key)這個函數的源碼是什麼

這個是打開https的訪問所用的到的函數

❷ 奼侲CDSA婧愪唬鐮侊紝C++緙栧啓鐨勶紝甯甯蹇欏府甯蹇

/*Copyright (c) Microsoft Corporation. All rights reserved.

Abstract:

Sample program for ECDSA 256 signing using CNG

Example for use of BCrypt/NCrypt API

Persisted key for signing and ephemeral key for verification

--*/

#include <windows.h>
#include <stdio.h>
#include <bcrypt.h>
#include <ncrypt.h>

#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)

#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)

static const BYTE rgbMsg[] =
{
0x04, 0x87, 0xec, 0x66, 0xa8, 0xbf, 0x17, 0xa6,
0xe3, 0x62, 0x6f, 0x1a, 0x55, 0xe2, 0xaf, 0x5e,
0xbc, 0x54, 0xa4, 0xdc, 0x68, 0x19, 0x3e, 0x94,
};

BYTE value[]=
{0x02,0x00,0x00,0x00};

void __cdecl wmain(
int argc,
__in_ecount(argc) LPWSTR *wargv)
{
NCRYPT_PROV_HANDLE hProv = NULL;
NCRYPT_KEY_HANDLE hKey = NULL;
BCRYPT_KEY_HANDLE hTmpKey = NULL;
SECURITY_STATUS secStatus = ERROR_SUCCESS;
BCRYPT_ALG_HANDLE hHashAlg = NULL,
hSignAlg = NULL;
BCRYPT_HASH_HANDLE hHash = NULL;
NTSTATUS status = STATUS_UNSUCCESSFUL;
DWORD cbData = 0,
cbHash = 0,
cbBlob = 0,
cbSignature = 0,
cbHashObject = 0,
cbTest = 0;
PBYTE pbHashObject = NULL;
PBYTE pbHash = NULL,
pbBlob = NULL,
pbSignature = NULL;

UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(wargv);

//open an algorithm handle
if(!NT_SUCCESS(status = BCryptOpenAlgorithmProvider(
&hHashAlg,
BCRYPT_SHA1_ALGORITHM,
NULL,
0)))
{
wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
goto Cleanup;
}

if(!NT_SUCCESS(status = BCryptOpenAlgorithmProvider(
&hSignAlg,
BCRYPT_ECDSA_P256_ALGORITHM,
NULL,
0)))
{
wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
goto Cleanup;
}

//calculate the size of the buffer to hold the hash object
if(!NT_SUCCESS(status = BCryptGetProperty(
hHashAlg,
BCRYPT_OBJECT_LENGTH,
(PBYTE)&cbHashObject,
sizeof(DWORD),
&cbData,
0)))
{
wprintf(L"**** Error 0x%x returned by BCryptGetProperty\n", status);
goto Cleanup;
}

//allocate the hash object on the heap
pbHashObject = (PBYTE)HeapAlloc (GetProcessHeap (), 0, cbHashObject);
if(NULL == pbHashObject)
{
wprintf(L"**** memory allocation failed\n");
goto Cleanup;
}

//calculate the length of the hash
if(!NT_SUCCESS(status = BCryptGetProperty(
hHashAlg,
BCRYPT_HASH_LENGTH,
(PBYTE)&cbHash,
sizeof(DWORD),
&cbData,
0)))
{
wprintf(L"**** Error 0x%x returned by BCryptGetProperty\n", status);
goto Cleanup;
}

//allocate the hash buffer on the heap
pbHash = (PBYTE)HeapAlloc (GetProcessHeap (), 0, cbHash);
if(NULL == pbHash)
{
wprintf(L"**** memory allocation failed\n");
goto Cleanup;
}

//create a hash
if(!NT_SUCCESS(status = BCryptCreateHash(
hHashAlg,
&hHash,
pbHashObject,
cbHashObject,
NULL,
0,
0)))
{
wprintf(L"**** Error 0x%x returned by BCryptCreateHash\n", status);
goto Cleanup;
}

//hash some data
if(!NT_SUCCESS(status = BCryptHashData(
hHash,
(PBYTE)rgbMsg,
sizeof(rgbMsg),
0)))
{
wprintf(L"**** Error 0x%x returned by BCryptHashData\n", status);
goto Cleanup;
}

//close the hash
if(!NT_SUCCESS(status = BCryptFinishHash(
hHash,
pbHash,
cbHash,
0)))
{
wprintf(L"**** Error 0x%x returned by BCryptFinishHash\n", status);
goto Cleanup;
}

//open handle to KSP
if(FAILED(secStatus = NCryptOpenStorageProvider(
&hProv,
MS_KEY_STORAGE_PROVIDER,
0)))
{
wprintf(L"**** Error 0x%x returned by NCryptOpenStorageProvider\n", secStatus);
goto Cleanup;
}

//create a persisted key
if(FAILED(secStatus = NCryptCreatePersistedKey(
hProv,
&hKey,
NCRYPT_ECDSA_P256_ALGORITHM,
L"my ecc key",
0,
NCRYPT_OVERWRITE_KEY_FLAG)))
{
wprintf(L"**** Error 0x%x returned by NCryptCreatePersistedKey\n", secStatus);
goto Cleanup;
}

cbTest=NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG;
if(FAILED(secStatus=NCryptSetProperty(hKey,
NCRYPT_EXPORT_POLICY_PROPERTY,
(PBYTE)&cbTest,
sizeof(DWORD),
NCRYPT_PERSIST_FLAG)))
{
wprintf(L"**** Error 0x%x returned by NCryptSetProperty\n", secStatus);
goto Cleanup;
}

//create key on disk
if(FAILED(secStatus = NCryptFinalizeKey(hKey, 0)))
{
wprintf(L"**** Error 0x%x returned by NCryptFinalizeKey\n", secStatus);
goto Cleanup;
}

//sign the hash
if(FAILED(secStatus = NCryptSignHash(
hKey,
NULL,
pbHash,
cbHash,
NULL,
0,
&cbSignature,
0)))
{
wprintf(L"**** Error 0x%x returned by NCryptSignHash\n", secStatus);
goto Cleanup;
}

//allocate the signature buffer
pbSignature = (PBYTE)HeapAlloc (GetProcessHeap (), 0, cbSignature);
if(NULL == pbSignature)
{
wprintf(L"**** memory allocation failed\n");
goto Cleanup;
}

if(FAILED(secStatus = NCryptSignHash(
hKey,
NULL,
pbHash,
cbHash,
pbSignature,
cbSignature,
&cbSignature,
0)))
{
wprintf(L"**** Error 0x%x returned by NCryptSignHash\n", secStatus);
goto Cleanup;
}

if(FAILED(secStatus = NCryptExportKey(
hKey,
NULL,
BCRYPT_ECCPRIVATE_BLOB,
NULL,
NULL,
0,
&cbBlob,
0)))
{
wprintf(L"**** Error 0x%x returned by NCryptExportKey\n", secStatus);
goto Cleanup;
}

pbBlob = (PBYTE)HeapAlloc (GetProcessHeap (), 0, cbBlob);
if(NULL == pbBlob)
{
wprintf(L"**** memory allocation failed\n");
goto Cleanup;
}

if(FAILED(secStatus = NCryptExportKey(
hKey,
NULL,
BCRYPT_ECCPRIVATE_BLOB,
NULL,
pbBlob,
cbBlob,
&cbBlob,
0)))
{
wprintf(L"**** Error 0x%x returned by NCryptExportKey\n", secStatus);
goto Cleanup;
}

if(!NT_SUCCESS(status = BCryptImportKeyPair(
hSignAlg,
NULL,
BCRYPT_ECCPRIVATE_BLOB,
&hTmpKey,
pbBlob,
cbBlob,
0)))
{
wprintf(L"**** Error 0x%x returned by BCryptImportKeyPair\n", status);
goto Cleanup;
}

if(!NT_SUCCESS(status = BCryptVerifySignature(
hTmpKey,
NULL,
pbHash,
cbHash,
pbSignature,
cbSignature,
0)))
{
wprintf(L"**** Error 0x%x returned by BCryptVerifySignature\n", status);
goto Cleanup;
}

wprintf(L"Success!\n");

Cleanup:

if(hHashAlg)
{
BCryptCloseAlgorithmProvider(hHashAlg,0);
}

if(hSignAlg)
{
BCryptCloseAlgorithmProvider(hSignAlg,0);
}

if (hHash)
{
BCryptDestroyHash(hHash);
}

if(pbHashObject)
{
HeapFree(GetProcessHeap(), 0, pbHashObject);
}

if(pbHash)
{
HeapFree(GetProcessHeap(), 0, pbHash);
}

if(pbSignature)
{
HeapFree(GetProcessHeap(), 0, pbSignature);
}

if(pbBlob)
{
HeapFree(GetProcessHeap(), 0, pbBlob);
}

if (hTmpKey)
{
BCryptDestroyKey(hTmpKey);
}

if (hKey)
{
NCryptDeleteKey(hKey, 0);
}

if (hProv)
{
NCryptFreeObject(hProv);
}
}

❸ android系統源碼怎麼查看簽名證書的sha1值

一、網路官方方法
第一種:使用keytool
keytool -list -v keystorefile -storepass 123456
其中keytool為jdk自帶工具;keystorefile為Android 簽名證書文件
第二種:在adt 22中直接查看
如果使用adt 22,可以在eclipse中直接查看:winows -> preferance -> android -> build。 如下圖示:

其中"SHA1 fingerprint"值即為Android簽名證書的sha1值。
二、實際情況
原以為網路還挺人性,說就說了還截了個圖,咦呀,頓時那個仰慕之情滔滔江水啊,真正實操起來,悲催的事出現了,第二種方法的實際截圖是這個樣子的,然後就一臉黑線。

也就是第二種方法根本不能用!!!!MY GOD LADY GAGA
使用keytool
一、配置環境變數
由於要用到keytool工具,而keytool是jdk里的一個工具,首先將jdk/bin所在的目錄加到環境變數的PATH中
看我的keytool所在位置

將所在路徑E:\Program Files\android others\jdk\bin加到PATH變數中:

二、找到另一個文件debug.keystore
這個文件是在你放工程的目錄下的,如果是默認的話,是在C:\Documents and Settings\Administrator\.android目錄下

三、運行命令
1、使用cd命令,將工作目錄切換到C:\Documents and Settings\Administrator\.android目錄下
2、輸入:keytool -list -keystore debug.keystore
3、輸入密鑰庫口令:如果沒設置,這里就是空,直接回車就進去了。

❹ 在易語言里,加密演算法只需要作為參數,求rc4演算法易語言源碼,不是用加密數據命令,而是

.版本2

.子程序加密為rc4,文本型,公開,用RC4演算法對文本進行加密
.參數加密的數據,文本型,,欲加密的文本
.參數加密密鑰,文本型,可空,用作加密的密碼
.局部變數臨時,位元組集
.局部變數s,位元組型,,"256"
.局部變數k,位元組型,,"256"
.局部變數i,整數型
.局部變數j,整數型
.局部變數y,整數型
.局部變數outstr,文本型
.局部變數temp,位元組型
.局部變數x,整數型
.局部變數t,整數型
.局部變數aaa,文本型

臨時=到位元組集(文本)
.計次循環首(256,i)
s[i]=i-1
.計次循環尾()
j=1
.計次循環首(256,i)
.如果真(j>取文本長度(密碼))
j=1
.如果真結束
k[i]=取代碼(取文本中間(密碼,j,1),)
j=j+1
.計次循環尾()
j=0
.計次循環首(256,i)
j=(j+s[i]+k[i])%256+1
temp=s[i]
s[i]=s[j]
s[j]=temp
.計次循環尾()
i=0
j=0
.計次循環首(取位元組集長度(臨時),x)
i=(i+1)%256+1
j=(j+s[i])%256+1
temp=s[i]
s[i]=s[j]
s[j]=temp
t=(s[i]+s[j]%256)%256+1
y=s[t]
aaa=到十六進制文本(位異或(臨時[x],y))
outstr=outstr+選擇(取文本長度(aaa)>1,「」,「0」)+aaa+「,」
.計次循環尾()
返回(outstr)

.子程序到十六進制文本,文本型
.參數數值,整數型,,

返回(多項選擇(右移(數值,4)+1,「0」,「1」,「2」,「3」,「4」,「5」,「6」,「7」,「8」,「9」,「A」,「B」,「C」,「D」,「E」,「F」)+多項選擇(位與(數值,15)+1,「0」,「1」,「2」,「3」,「4」,「5」,「6」,「7」,「8」,「9」,「A」,「B」,「C」,「D」,「E」,「F」))

❺ PHP源代碼與ASP源代碼有什麼不同呀

PHP和ASP都不是同一種語言

什麼是ASP語言?

Active server pags ( 動態伺服器主頁, 簡稱ASP ), 內含於 Internet Information
Server(IIS)當中,提供一個伺服器端 (server-side) 的scripting 環境,讓你產生和執行動態, 互動式, 高效率的站點伺服器的應用程序。你不必擔心瀏覽器是否能執行你設計出來的Active Server Pages,你的站點伺服器會自動將Active Server Pages的程序碼,解釋為標准HTML格式的住頁內容,在送到用戶端的瀏覽器上顯示出來。用戶端只要使用常規可執行HTML碼的瀏覽器,
即可瀏覽Active Server Pages所設計的主頁內容。

什麼是PHP語言

PHP,一個嵌套的縮寫名稱,是英文「超級文本預處理語言」(PHP:Hypertext Preprocessor)的縮寫。PHP 是一種 HTML 內嵌式的語言,PHP與微軟的ASP頗有幾分相似,都是一種在伺服器端執行的「嵌入HTML文檔的腳本語言」,語言的風格有類似於c語言,現在被很多的網站編程人員廣泛的運用。PHP 獨特的語法混合了 C、java、Perl 以及 PHP 自創新的語法。它可以比 CGI 或者 Perl 更快速的執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;與同樣是嵌入HTML文檔的腳本語言JavaScript相比,PHP在伺服器端執行,成分利用了伺服器的性能;PHP執行引擎還會將用戶經常訪問的PHP程序駐留在內存中,其他用戶在一次訪問這個程序時就不需要誠信編譯程序了,只要直接執行內存中的代碼就可以了,這也是PHP高效率的體現之一。PHP具有非常強大的功能,所有的CGI或者JavaScript的功能PHP都能實現,而且支持幾乎所有流行的資料庫以及操作系統。

PHP 最初是1994年Rasmus Lerdorf創建的,剛剛開始只是一個簡單的用Perl語言編寫的程序,用來統計他自己網站的訪問者。後來又用C語言重新編寫,包括可以訪問資料庫。在1995年以Personal Home Page Tools (PHP Tools) 開始對外發表第一個版本,Lerdorf寫了一些介紹此程序的文檔,並且發布了PHP1.0。在這早期的版本中,提供了訪客留言本、訪客計數器等簡單的功能。以後越來越多的網站使用了PHP,別且強烈要且增加一些特性,比如循環語句和數組變數等等,在新的成員加入開發行列之後,在1995年中,PHP2.0發布了。第二版定名為PHP/FI(Form Interpreter)。PHP/FI加入了對mSQL的支持,從此建立了PHP在動態網頁開發上的地位。到了1996年底,有15000個網站使用 PHP/FI;時間到了1997年中,使用PHP/FI的網站數字超過五萬個。而在1997年中,開始了第三版的開發計劃,開發小組加入了 Zeev Suraski 及 Andi Gutmans,而第三版就定名為PHP3。2000年,PHP4.0又問世了,其中增加了許多新的特性。

PHP的特性包括:

開放的源代碼:所有的PHP源代碼事實上都可以得到。
PHP是免費的。
基於伺服器端:由於PHP是運行在伺服器端的,即使再多的用戶,再復雜的程序也不會影響運行的速度。
跨平台:PHP可以運行在UNIX、linux、WINDOWS下。
嵌入HTML:因為PHP可以嵌入HTML語言,所以學習起來並不困難。
簡單的語言:PHP堅持腳本語言為主,與Java以C++不同。
效率高:PHP消耗相當少的系統資源。
圖像處理:用PHP動態創建圖像

PHP 3與PHP 4的比較

PHP3跟Apache伺服器緊密結合的特性;加上它不斷的更新及加入新的功能;而且幾乎支持所有主流與非主流資料庫;再以它能高速的執行效率,使得PHP在1999年中的使用站點已經超過了150000萬。加上它的源代碼完全公開,在 Open Source意識抬頭的今天,它更是這方面的中流砥柱。不斷地有新的函數庫加入,以及不停地更新的活力,使得PHP無論在UNIX、LINUX或是Windows的平台上都可以有更多新的功能。它提供豐富的函數,使得在程序設計方面有著更好的支持。

PHP4.0整個腳本程序的核心大幅更動,讓程序的執行速度,滿足更快的要求。在最佳化之後的效率,已較傳統CGI或者ASP等程序有更好的表現。而且還有更強的新功能、更豐富的函數庫。無論您接不接受,PHP 都將在 Web CGI 的領域上,掀起巔覆性的革命。對於一位專業的Web Master 而言,它將也是必修課程之一。

PHP 4.0是更有效的,更可靠的動態Web頁開發工具,在大多數情況運行比 PHP 3.0要快,其腳本描述更強大並且更復雜, 最顯著的特徵是速率比的增加。PHP4.0這些優異的性能是PHP 腳本引擎重新設計產生的結果:引擎由 AndiGutmans 和 Zeev Suraski從底層全面重寫。PHP4.0 腳本引擎 ——Zend 引擎,使用了一種更有效的「編譯——執行」方式, 而不是PHP 3.0 採用的「執行 ——當解析時」模型。

PHP4在3.0版的基礎上增加或增強了許多有用的特徵,主要如下:

(1)別名:在PHP4中,可以利用引用為變數賦值,這給編程帶來了很大的靈活性。

(2)擴充了API 模塊:PHP 4.0 為擴展的 API 模塊的提供了擴展PHP介面模塊, 它比舊的 API 版本顯著地快。 PHP 模塊已有的及最常用的介面多數被轉換到使用這個擴展的介面。

(3)自動資源釋放:PHP4增加了引用計數功能,這種新技術的引入使PHP4具有了自動內存管理功能,減輕了開發人員的負擔。

(4)布爾類型:PHP 4.0 支持布爾類型。

(5)進程生成:在 UNIX 環境下的 PHP 4.0 提供了一個很智能和通用的生成進程, 使用了一種名為基於automake/libtool的系統生成技術。

(6)COM/DCOM 支持:PHP 4.0 提供 COM/DCOM 支持 ( 僅用於Windows 環境 ) 可以無縫地存取和訪問 COM 對象。

(7)與PHP 3.0 兼容性很好:PHP 4.0 是與 PHP 3.0 代碼向後兼容性接近100% 。由於 PHP 4 的改進的體系結構,兩者有一些細微的差別,但是大多數人將可能永遠不可能遇上這種情況。
PHP介紹

(8)配置:PHP4重新設計和增強了PHP。ini文件,這使得用PHP。ini來配置PHP顯得極為容易,這個文件可以在運行時被Apache(unix系統)或由Windows 注冊(Windows 環境)。

(9)加密支持:PHP4實現了完整的加密, 這些加密功能是一個完整的mycrypt庫,並且 PHP 4.0 支持哈希函數。Blowfish,TripleDES,MD5,並且SHA1 也是可使用的一些加密演算法。

(10)類型檢查:PHP 4.0 支持同一操作符用於評類型檢查:「===「( 3 等號運算符 ), 為在兩個值和其類型之間作檢查。例如,「 3 」 ===3 將視為假 ( 類型是不同的 ), 而「 3 」 ==3 ( 相等判斷 ) 將視為真。

(11)FTP 支持:PHP 4.0 支持 FTP 。通常, 你會為通過一個數據機連接下載一個大文件提供一個介面。然而, 如果你確實有需要,可以使用PHP 。

(12)PHP4新增函數或功能增強函數:PHP 4.0 新增了許多函數,同時也將許多現有的函數功能進行了增強,以下是一些例子。 array_count_values() eval() foreach() nclude() ob_end_clean() ob_end_flush() ob_get_contents() ob_start() strip_tags() unset()

(13)「here」列印:PHP 4.0 的「Here」列印是與Perl類似的, 盡管完全不相同。「Here」是列印大容量文章的一個有用的方法,例如在 HTML文件中,不會漏掉任何一個字元,例如目錄標記。

(14)HTTP Session fallback 系統:為 HTTP Session管理的一個 fallback 系統在 PHP 4.0被實現 。預設情況下,Session標識符由cookies存儲。如果沒有cookies支持或一項cookies任務失敗,Session標識符自動被創建並在 URL 的查詢字元串中被攜帶。

(15)ISAPI 支持:PHP 4.0 能作為一個個性化的 ISAPI 模塊作為 IIS插件 。這比 PHP 3.0 更有效, 它作為一個外部的程序來運行。

(16)內存:PHP 4.0 能更有效的使用內存, 導致較少的內存佔用消耗,這主要歸功於引用計數技術的實現。

(17)其他類成員函數:在 PHP 4.0 你能在成員函數本身的作用域或全局范圍內調用其他類的成員函數。例如,你能用一個子函數覆蓋父函數,並在子函數中調用父函數。

(18)多維數組:在 PHP 4.0 ,利用GET,POST,Cookies的進行的數據傳輸支持多維數組。

(19)個性化的 HTTP Session支持:HTTP Session處理, 包括 fallback 系統管理,在 PHP 4.0被它的新庫函數實現 。在版本 3.0 中處理Session要求使用 PHPLIB 和第三方的庫函數, 它比把Session直接地由 PHP 支持慢了許多。

(20)個性化的 Java 支持:PHP 4.0 支持和java的交互。這種個性化的Java 支持為PHP 在 Java 對象上創建和使用方法提供一個簡單並且有效的工具。
21)對象和數嵌套組:PHP 4.0 實現了功能更加強大的對象, 移去了 PHP 3.0存在的種種句法限制。對象能在數組以內被嵌套並且反過來也如此, 可以根據你的需要實現嵌套。

(22)面向對象的編程:PHP 4.0 為面向對象的編程和構造類及對象提供擴展的功能和新特徵。PHP4實現了對象重載,引用技術等新技術。

(23)對象重載支持:對象重載語法允許第三方的基於面向對象的類庫使用 PHP4 的面向對象的特徵存取他們自身的功能。使用這個特徵的一個 COM 模塊已經被實現了。

(24)輸出緩沖支持:PHP 提供了一個輸出緩沖函數集合。輸出緩沖支持允許你寫包裹函數功能壓縮緩沖區。在 PHP4 的輸出緩沖支持允許 HTML 頭信息存放, 無論 HTML的正文是否輸出。頭信息( (header(), content type, and cookies ) 不採用緩沖 。

(25)增加了PCRE 庫:PHP 4.0 包括一個 Perl 兼容的正則表達式 (PCRE ) 庫, 和正常regex庫一起與 PHP 綁定。split 和replace PCRE 功能被支持。PCRE 和 Perl 正規表達式之間有一些細微差別。

(26)PHP.ini 文件:PHP.ini文件在 PHP4.0 被重新設計, 使用的 PHP 的配置PHP.ini是更容易並且更有效的。全部文件能被Apache 在運行時間操作 ( 在 Apache環境 下 ) 或由 Windows 注冊表 ( 在 Windows 下面 ) 。被加入PHP.ini文件的配置指令自動地在所有相關的模塊中被支持。

(27)引用計數:PHP 4.0 為系統中的每個數值提供了引用計數, 包括資源。一旦一個資源不再被任何變數引用,它自動地被釋放以節省內存資源。利用這個特徵的最明顯的例子一個內置SQL查詢的循環語句。在PHP 3.0中 ,每次遞歸另外的 SQL 結果集合重復申請內存,直到腳本執行完畢,這些結果集合佔用的內存才被釋放。

(28)支持引用:通過引用可以改變一個變數的值。

(29)函數的運行時綁定:PHP 4.0 的運行時間綁定功能允許你在他們被聲明以前調用, 無論聲明是否在代碼以後或是在運行時間。

(30)類的運行時信息:PHP 4.0 支持在運行時刻存取下列類信息:一個對象的類名,一個對象的父類的類名字,以及對象函數所在的名字。

(31)伺服器抽象層:為支持Web伺服器提供了增強型 SAPI ( 伺服器 API ) 介面,是 PHP 4。0 不可分的一部分。這個伺服器抽象層,提供了通用的WEB伺服器介面支持,支持多線程WEB伺服器,為大多數的WEB伺服器提供透明的支持, 這些伺服器包括 Apache ,IIS ( ISAPI ), 以及 AOL 伺服器。

(32)語法的點亮顯示:PHP 4.0 語法的點亮顯示允許開發者看見源代碼而不是腳本, 這個功能比PHP 3。0中的更有效。它跑得更快,更執行得更好,並且產生更緊湊的HTML代碼。

(33)由引用改變變數的值:PHP 4.0 由引用支持可變的賦值, 「關聯」的2個變數之中個的任何一個的值被改變,另外的變數的值同樣被改變,這類似與C中的指針類型。

(34)在引用字元串中的變數引用:PHP 4.0 增強了在引用字元串中的變數引用。例如, 這個例子在 PHP 3.0中 是不可能做到的 : print 「${a[0]->bingo}「

PHP 在資料庫方面的豐富支持,也是它迅速走紅的原因之一,它支持下列的資料庫或是數據文件:

· Adabas D
· DBA
· dBase
· dbm
· filePro
· Informix
· InterBase
· mSQL
· Microsoft SQL Server
· MySQL
· Solid
· Sybase
· ODBC
· Oracle 8
· Oracle
· PostgreSQL

而在 Internet 上它也支持了相當多的通訊協議 (protocol),包括了與電子郵件相關的 IMAP, POP3;網管系統 SNMP;網路新聞 NNTP;帳號共用 NIS;全球信息網 HTTP 及 Apache 伺服器;目錄協議 LDAP 以及其它網路的相關函數。

除此之外,用 PHP 寫出來的 Web 後端 CGI 程序,可以很輕易的移植到不同的操作系統上。例如,先以 Linux 架的網站,在系統負荷過高時,可以快速地將整個系統移到 SUN 工作站上,不用重新編譯 CGI 程序。面對快速發展的 Internet,這是長期規劃的最好選擇。
在加入其它的模塊之後,提供了更多樣的支持如下:

· 英文拼寫檢查
· BC 高精確度計算
· 西洋歷法
· PDF 文件格式
· Hyperwave 伺服器
· 圖形處理
· 加密與解碼功能
· 散列處理
· WDDX 功能
· qmail 與 vmailmgr 系統
· 壓縮文件處理
· XML 解析

除此之外,一般語言有的數學運算、時間處理、文件系統、字元串處理、行程處理等功能,它一樣都不缺。再加上它是免費的系統,使得成本與效益比,幾乎等於無限大!

3.3 PHP 及其語言比較

無可置疑的,寫 CGI 的方式有很多種,而 PHP 只是其中的一種選擇罷了。對資深的網站站長來說,CGI 的寫作語言應是隨著需求而更動。畢竟,在一個對系統反映速度要求極嚴格的系統而言,恐怕只有 NSAPI 語言寫的 CGI 程序才能符合要求了。在其它的場合,相信使用 PHP 來作為 CGI 的語言是游刃有餘,而且是最適合的。
以下是幾種語言的比較:

程序語言 PHP ASP CGI NSAPI ISAPI
操作系統 均可 Win32 均可 均可 Win32
Web伺服器 幾種 IIS 均可 Netscape Server IIS
執行效率 快 快 慢 極快 極快
穩定性 佳 中等 最高 差 差
開發時間 短 短 中等 長 長
修改時間 短 短 中等 長 長
程序語言 PHP VB 不限 C/C++ C/Delphi
網頁結合 佳 佳 差 差 差
學習門檻 低 低 高 極高 高
函數支持 多 少 不定 中等 少
系統安全 佳 極差 最佳 佳 尚可
使用站點 超多 多 多 極少 少
改版速度 快 慢 無 慢 慢

其中的 PHP 可用在幾種 Web 伺服器上;傳統 CGI 就不限是哪種操作系統或 Web 伺服器平台;NSAPI 一定要在 Netscape 的伺服器 (如 Netscape Enterprise Server 或 FastTrack Server) 上才可以執行,但可支持多種操作系統 (UNIX 或 Win32);ASP 及 ISAPI 只在 IIS 上有完整的功能。

在穩定性上,由於 NSAPI 或 ISAPI 是動態連結的方式,因此在執行若出現問題,會使得 Web 伺服器一起癱瘓。而 ASP 在吾人實際應用經驗上,隔陣子就會使系統不穩定,需要重開操作系統。PHP 在許多的站點使用上,不但長期使用都沒有問題,而且程序的穩定性也不錯。當然最穩的還是傳統 CGI 程序,因為它是由操作系統負責控制,不會因 CGI 程序的錯誤導致 Web 伺服器的不穩定。

在開發及維護時間上,PHP 及 ASP 都有不錯的表現。而 NSAPI 及 ISAPI 則需要長時間的開發過程,在穩定上線後,這二種語言反倒是效率最佳的方法。傳統的 CGI 程序則要視開發工具語言而定了,用 Perl 或是 shell script 不需要編譯的過程,直接就可以執行,若用 Delphi 或 VC/BCB 甚至用組合語言等都要經過編譯才能執行,至於用 VB 來寫傳統 CGI,唉....。

要比較和網頁結合的能力,PHP 和 ASP 是並駕齊驅的,其它的方式就不能內嵌 HTML 語法了。而這也是影響開發時間的因素之一。

就系統安全性而言,ASP 是最差的,在沒有經過微軟的 IIS Service Pack 處理過,使用 ::$DATA 就可以看到 ASP 的源代碼,這真是叫人不敢領教。當然,傳統 CGI 的程序,由於是由操作系統直接管理,要破解的難度最高,黑客必須由操作系統下手,而不能由 Web 伺服器下手。PHP 在許多商業及非商業使用時,也沒有聽過有什麼安全的問題。

在新增功能及改版方面,傳統的 CGI 由於不受任何語言限制,沒有這方面的問題。PHP 是最有活力的,數天至數周就有一個新版本出現,每次的新版,就代表更多的功能及更改更多的錯誤。其它的 ASP、NSAPI、ISAPI 就視它的 Web 伺服器改版速度了,ASP要等到 IIS 5.0 出現時,才會有 ASP 3.0。

總而言之,在 Web 的後端 CGI 程序,就像魚與熊掌一般,沒有高效能又開發方便的選擇。不過相信 PHP 是處於開發容易、效能亦不錯的平衡點上。

如果說ASP是一個COM,那麼PHP說的更精確了可以說PHP是一個純粹的Script翻譯器。這也是PHP由3.0升級為4.0的一個重大原因,在4。0這個版本中,由於重寫了語法分析器,從而加快了PHP整體的效能。而且從中你也就會明白為什麼PHP需要支持這種或是那種擴充功能時它一定要與相應系統的lib庫進行再編繹的原因。正因為它是正宗的「翻譯器」,所以它是將script翻譯成為需要執行的函數,再去執行它們,外部擴充不能由一些「動態載入」的方式進行,所以只能靜態的編繹進PHP中(這只能在windows中除外)。

❻ 下載軟體經常看到的sha值和MD5值到底是什麼意思都是校驗碼么。

1.SHA值就像人的指紋,是文件的數字指紋,是唯一的,一個文件對應一個唯一的SHA1值,一般用來確認你的文件和官方發布的是否一致.如果官方原版文件被別人做過手腳,那麼算出來的SHA1值就會不同.所以SHA1值是用來「驗明正身」的。有些居心叵測的人在官方系統光碟裡面加入木馬程序、廣告程序等,然後再放出來給人下載,如果你不檢查SHA1值就貿然安裝就中招了,可以在網上下載一個數字指紋檢驗器來計算你下載回來的win7系統文件的SHA1值,然後到微軟的MSDN去查看官方發布的SHA1值,如果兩者相等,說明你下載的文件是和官方提供的是一樣的,你可以放心的安裝了。這就是SHA1值的用處,其他地方不用SHA1值的。 操作系統的ISO文件一般可以直接刻盤安裝,不用解壓出來。為了保險起見你最好用「UltraISO」軟體打開你的ISO文件,如果顯示為「可啟動XX文件」那麼你就放心直接刻錄吧。 2. MD5 md5的全稱是message-digest algorithm 5(信息-摘要演算法),在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest開發出來,經md2、md3和md4發展而來。它的作用是讓大容量信息在用數字簽名軟體簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的大整數)。不管是md2、md4還是md5,它們都需要獲得一個隨機長度的信息並產生一個128位的信息摘要。雖然這些演算法的結構或多或少有些相似,但md2的設計與md4和md5完全不同,那是因為md2是為8位機器做過設計優化的,而md4和md5卻是面向32位的電腦。這三個演算法的描述和c語言源代碼在internet rfcs 1321中有詳細的描述( http://www.ietf.org/rfc/rfc1321.txt) ,這是一份最權威的文檔,由ronald l. rivest在1992年8月向ieft提交。

求採納

❼ 安裝docker-io之後怎麼啟動docker

對於Docker的安裝在官網上針對不同的操作系統分別進行了描述,Ubuntu上安裝Docker,對於ubuntu操作系統來說必須是64位的,因為Docker的官網上只是提供了64位的docker,如果需要32位的docker則需要下載源碼進行編譯,這里有篇文章介紹了Docker源碼如何進行編譯成32位,編譯32位的Docker。但是對於我使用的Ubuntu來說正好是32位的。通過下面的兩條命令可以看出操作系統的位數和Linux的內核版本。

root@ubuntu:/tmp#uname -a
Linux e529c1b7772a 3.13.0-12-generic #32-Ubuntu SMP Fri Feb 21 17:44:24 UTC 2014 i686 i686 i686 GNU/Linux
root@ubuntu:/tmp#file /sbin/init
/sbin/init: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=, stripped
如果想在32為的Ubuntu操作系統上運行Docker的話,就必須安裝32位的Docker。在Ubuntu中提供docker1.01-32位的deb包,可以直接點擊「docer1.01-32位deb包」跳轉到下載頁面。下載完成後,直接使用dpkg –i進行安裝。
dpkg -i docker.io_1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1_i386.deb
Selecting previously unselected package docker.io.
(Reading database ... 150021 files and directories currently installed.)
Preparing to unpack docker.io_1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1_i386.deb ...
Unpacking docker.io (1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1) ...
Setting up docker.io (1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1) ...
docker.io start/running, process 10456
Processing triggers for ureadahead (0.100.0-16) ...
Processing triggers for man-db (2.6.6-1) ...
也可以參考下面的這篇文章《Docker 1.0.1 已經可以在 Ubuntu 14.04 LTS 上測試了!》進行安裝。安裝完成後,可以使用下面的命令確定安裝的版本和基本的信息。由於docker使用go語言進行編寫的,所以要依賴於GO的編譯工具和庫文件。
oot@ubuntu:/tmp# docker version
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.2.1
Git commit (client): 990021a
Server version: 1.0.1
Server API version: 1.12
Go version (server): go1.2.1
Git commit (server): 990021a
root@ubuntu:/tmp# docker info
Containers: 1
Images: 7
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Dirs: 10
Execution Driver: native-0.2
Kernel Version: 3.13.0-12-generic
WARNING: No swap limit support
官方安裝方式docker pull imagename從docker的索引中心下載,imagename是鏡像名稱,例如docker pull ubuntu就是下載base ubuntu並且tag是latest。
root@ubuntu:/# docker pull ubuntu:14.04
Pulling repository ubuntu
c4ff7513909d: Download complete
511136ea3c5a: Download complete
1c9383292a8f: Download complete
9942dd43ff21: Download complete
d92c3c92fa73: Download complete
0ea0d582fd90: Download complete
cc58e55aa5a5: Download complete
root@ubuntu:~/Downloads# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 c1b5399bd2ee 8 minutes ago 205.3 MB
learn/tutorial latest 8dbd9e392a96 17 months ago 128 MB
root@ubuntu:/# docker run -i -t ubuntu /bin/bash
2014/09/04 13:04:28 exec format error
docker run -i -t learn/tutorial /bin/bash
2014/09/04 14:45:13 exec format error
PS:在安裝完成Dokcer後,使用Pull命令sudo docker pull ubuntu:14.04從鏡像倉庫獲取ubuntu的鏡像後,然後使用run命令docker run -i -t ubuntu /bin/bash直接運行該鏡像時,會出現下面的錯誤信息,後來我又嘗試著使用官方演示使用的learn/tutorial鏡像,還是出現同樣的問題,現在懷疑可能是由於我安裝的DOcker是32位的,而Image是64位的不匹配造成的。前面說過Docker默認提供的都是64位,其中提供的Image自然也都是64位,所以會出現下面的錯誤信息。在Docker Hub Registry里的大多數鏡像都是64位。這里有一個關於該錯誤的討論帖「Ddocker.io: Docker should recommend
linux-image-amd64 」。所以,如果想在32位的Docker基礎上運行Ubuntu的Image那要求Ubuntu的image也必須是32位。這就需要製作32位Ubuntu的Image。這里有一個官方提供的可用的Ubuntu image的列表,Ubuntu Image tag。

熱點內容
百度雲解壓密碼忘記 發布:2024-11-26 14:35:36 瀏覽:863
最差擬合演算法 發布:2024-11-26 14:21:17 瀏覽:739
指令式編程 發布:2024-11-26 14:16:24 瀏覽:19
阿里雲ftp修改密碼 發布:2024-11-26 14:12:11 瀏覽:617
mt4伺服器ip 發布:2024-11-26 13:31:56 瀏覽:867
虛擬機編譯得到bin文件 發布:2024-11-26 13:31:00 瀏覽:419
javaenumofenum 發布:2024-11-26 13:20:09 瀏覽:922
腳本中ge 發布:2024-11-26 13:14:24 瀏覽:376
安卓的gps怎麼開 發布:2024-11-26 13:14:18 瀏覽:86
砍人腳本 發布:2024-11-26 13:14:15 瀏覽:257